我正在 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
关系
如何修改上述查询,以便返回的每条记录都包含路径上的一个节点以及来自的所有传出关系(NEXT
和 BRANCH
)的列表它?
请注意,我不想遍历此查询中的 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)) ]
有关如何将 Activity 流实现为非托管扩展的示例,您可以查看以下内容:https://github.com/jexp/neo4j-activity-stream
关于java - 密码遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21199936/