Hi Peter,

I think it makes most sense to share a sample graph of your structure?

Just some notes about things that came to my mind.

1. I would add a direction here: match p = (c:Card)-[r:describes*]->(c1:
Card)
2. might be too much, as you kinda check that none of those cards was a
created one (which would assume you have broken data where you have
multiple -[created:]- relationships in a single tree ? It might be good
enough to check it with (c) instead ?
3. I think it is also good enough to return c, and I'd probably also filter
for those where c has no outgoing describes relationship

So something like this:

match p = (c:Card)-[r:describes*]->(root:Card)
where not (root)<-[:created]-() and not (root)-[:describes]->()
return root

HTH

Cheers,

Michael




On Thu, Mar 27, 2014 at 1:36 AM, Peter Whitfield <[email protected]>wrote:

> I have a graph where users can create cards represented by
> (:User)-[:created]->(:Card), and users can collected other user's cards
> which results in a clone of the original card:
> (:User)-[:collected]->(clone:Card)-[:describes]->(original:Card).
> Users can collect 'collected' cards, so we can end up with a tree of cards
> with the original created card at the root.
>
> My problem is that in the original (Postgres) DB, some of the original
> cards have been deleted, so we don't have the canonical card. We're
> planning to find the 'orphaned' sub trees, find the new root of each sub
> tree and turn it into a 'created' card rather than a collected card.
>
> I think I'm homing in on a query that will give me all the candidate 'new'
> canonical cards, but I'm not sure if I'm getting the right results. I'd
> appreciate help from anyone who can spare the time to have a look at my
> query and tell me if you think it's giving me what I think it is...
>
> My logic in this query is:
>
> 1. match p = (c:Card)-[r:describes*]-(c1:Card)   : this should match a
> complete tree by traversing all the [:describes] relations. The intention
> is that this should take any node in a tree of cards and match the whole
> tree (hence the non-directional relationship in the query)
>
> 2. where not any (x in nodes(p) where (x)<-[:created]-(:User))    : match
> the path when there isn't any node in the tree that has a [:created]
> relation
>
> 3. return distinct filter (card in nodes(p) where not
> (card)-[:describes]->(:Card))    : give me the card in the path that
> doesn't have any outbound [:describes] relations which should be the root
> of the tree
>
> *Question 1: Is this giving me what I'm after?*
>
> match p = (c:Card)-[r:describes*]-(c1:Card) where not any(x in nodes(p)
> where (x)<-[:created]-(:User))  return distinct filter (card in nodes(p)
> where not (card)-[:describes]->(:Card))
>
> I'm fairly sure this is giving me all the candidate new canonical cards.
>
> *Question 2: If so, how do I re-shape the query to allow me to change the
> relationships for these cards (change the [:collected] relation into a
> [:created] relation)?*
>
> Sorry for the long-winded post. I hope someone can point me in the right
> direction... :-)
>
> Thanks!
>
> Pete
>
> --
> You received this message because you are subscribed to the Google Groups
> "Neo4j" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to