Reputation: 5554
I am new to Neo4j
and currently playing with this tree structure:
The numbers in the yellow boxes are a property named order
on the relationship CHILD_OF
.
My goal was
a) to manage the sorting order of nodes at the same level through this property rather than through directed relationships (like e.g. LEFT
, RIGHT
or IS_NEXT_SIBLING
, etc.).
b) being able to use plain integers instead of complete paths for the order
property (i.e. not maintaining sth. like 0001.0001.0002
).
I can't however find the right hint on how or if it is possible to recursively query the graph so that it keeps returning the nodes depth-first
but for the sorting at each level consider the order
property on the relationship.
I expect that if it is possible it might include matching the complete path iterating over it with the collection utilities of Cypher
, but I am not even close enough to post some good starting point.
Question
What I'd expect from answers to this question is not necessarily a solution, but a hint on whether this is a bad approach that would perform badly anyways. In terms of Cypher
I am interested if there is a practical solution to this.
I have a general idea on how I would tackle it as a Neo4j server plugin with the Java traversal or core api (which doesn't mean that it would perform well, but that's another topic), so this question really targets the design and Cypher
aspect.
Upvotes: 3
Views: 1478
Reputation: 41676
This might work:
match path = (n:Root {id:9})-[:CHILD_OF*]->(m)
WITH path, extract(r in rels(path) | r.order) as orders
ORDER BY orders
if it complains about sorting arrays then computing a number where each digit (or two digits) are your order and order by that number
match path = (n:Root {id:9})-[:CHILD_OF*]->(m)
WITH path, reduce(a=1, r in rels(path) | a*10+r.order) as orders
ORDER BY orders
Upvotes: 1