java - 密码遍历

标签 java neo4j cypher

我正在 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)) ]

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

关于java - 密码遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21199936/

相关文章:

java - Java API 与 Python 和 Cypher for Neo4J 的性能对比

java - 在 HashSet 中使用并集和交集方法

java - 将 JLabels 的 ArrayList 添加到 JPanel 中

neo4j - 密码查询中的"No relation"

java - 如何通过只读操作最优地遍历 Neo4j Graph?

neo4j - 使用浏览器界面导入密码脚本

java - 为什么我在源代码中遇到了 inputMismatchException?

java - transient 属性值异常 : object references an unsaved transient instance - save the transient instance beforeQuery flushing

frameworks - 哪个 Web 应用程序框架与 Neo4J 高度集成?

Neo4j 2.0 Cypher 查询 - 在 FOREACH 中创建