我正在Neo4j图中实现类似链接列表结构的东西。通过执行许多与此类似的语句来创建图:

CREATE (R1:root{edgeId:2})-[:HEAD]->
        (:node{text: 'edge 2 head text', width:300})-[:NEXT{edge:2, hard:true}]->
        (:node{text: 'edge 2 point 0'})-[:NEXT{edge:2}]->
        (n0:node{text: 'edge 2 point 1'}),
        (n0)-[:BRANCH]->(:root{edgeId:3}),
        (n0)-[:NEXT{edge:2}]->
        (:node{text: 'edge 2 point 2'})-[:NEXT{edge:2}]->
        (:node{text: 'edge 2 point 3'})<-[:TAIL{edge:2}]->(R1)


遍历边缘意味着从根节点开始,遵循其到第一个节点的传出HEAD关系,并遵循NEXT关系链,直到从我们开始的根节点到达具有传入TAIL关系的节点。

即:

MATCH path = (root:root:main)-[:HEAD]->(a:point)-[n:NEXT*]->(z:point)<-[:TAIL]-(root)
RETURN nodes(path), n


每个节点都具有传出的NEXT关系,但是某些节点也具有BRANCH关系,该关系指向其他边的根节点。

在上面的查询中,nodes(path)显然返回沿边缘的所有节点,并且n列出沿它的每个节点的传出NEXT关系。我如何修改此查询,以便除了传出NEXT关系外,它还返回所有传出BRANCH关系

如何修改上面的查询,以使返回的每个记录在路径上都包含一个节点以及该列表中所有传出关系(NEXTBRANCH)的列表?

请注意,我不想遍历此查询中的BRANCH边,只希望它告诉我它们在那里。

(PS我正在用Java实现这种策略,但是到目前为止,我更喜欢直接执行Cypher查询,而不是使用Traversal API。如果这样做使我自己更加困难,请引起我注意。)

最佳答案

您可以随时返回路径表达式。

MATCH path = (root:root:main)-[:HEAD]->(a:point)-[n:NEXT*]->(z:point)<-[:TAIL]-(root)
RETURN extract(x in nodes(path) | [x, x-[:BRANCH]->()]), n


x-[:BRANCH]->()返回路径的集合,因此,如果您只想访问关系,则必须执行

[p in x-[:BRANCH]->() | head(rels(p)) ]


有关如何将活动流实现为非托管扩展的示例,您可以查看以下内容:https://github.com/jexp/neo4j-activity-stream

07-24 09:52
查看更多