开发者

Generic traversal of a directed tree with Neo4J

开发者 https://www.devze.com 2023-04-11 05:18 出处:网络
I modelled a directed tree structure using the graph database Neo4J. So I have something li开发者_运维知识库ke this: http://ouwarovite.net/YAPC/220px-Binary_tree.svg.png (not mandatory binary)

I modelled a directed tree structure using the graph database Neo4J. So I have something li开发者_运维知识库ke this: http://ouwarovite.net/YAPC/220px-Binary_tree.svg.png (not mandatory binary)

Users of my database can add child nodes of existing nodes at will, so the height of the tree and the degree of the single nodes is unknown.

Now, I want to query my tree like this: Starting with node x, give me all leaves that are descendants of leave x.

Is this kind of query performable with Gremlin or Cypher and if so, how to do this achieving the maximum of performance? (I haven't found a possibility to perform queries on 'generic' trees because you alway have to specify a maximum depth)

I know, that it's possible with the REST / JSON framework and the JAVA API like this:

POST /db/data/node/51/traverse/node 
{ 
"return_filter" : 
    {
    "body" : "position.endNode().hasProperty('leave')" ,
    "language" : "javascript" 
     }, 
"relationships" : [ { "type" : "_default", "direction" : "out" } ] , 
"prune_evaluator" : { "name" : "none" , "language" : "builtin" }
}

(my leaves have the property 'leave', my edges have no type -> so _default)

Is there a simpler / better way to do this maybe with a better performance?


Cypher could look like that:

start root=node({rootId}) 
match root-[*]->child
where child.leave
return child

rootId being a parameter to be passed in.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号