使用 Cypher 在 Neo4j 中查询递归关系链

Kev*_*man 2 neo4j relationships cypher

我有一个图形数据库,它正在对消息的元数据和可以包含在这些消息中的字段进行建模。其中一些字段可以是“组”,它们是其他字段的组。我试图问 Neo 的是“哪些消息正在使用这个组?”。以下是可用于从消息获取到组的路径类型列表:

message-[:INLINE]->group  (the fields of a group are used inline on a message)
message-[:FIELDREF]->(fref)-[:FIELD]->(field)-[:DATATYPE]->group (the group is used as a data type by a field on the message)
Run Code Online (Sandbox Code Playgroud)

第二个链是递归的。换句话说,-[:FIELDREF]->(fref)-[:FIELD]->(field)-[:DATATYPE]-(group) 段可以一遍又一遍地发生,然后最终到达我感兴趣的组在。

所以,我想知道的是,我如何在路径中的每个单独元素上要求重复的关系链,而不仅仅是多个(例如,关系名称后面的 *)?

回顾一下,您可以通过遍历 [:INLINE] 关系从消息进入组,然后可以遵循 n 个“fieldref-field-datatype-group”链。或者您可以从通过遍历 n 个“fieldref-field-datatype-group”链来获取消息。

START group=node({sourceGroupId})
... ? ? ? ...
Run Code Online (Sandbox Code Playgroud)

所以我想要像 [?:INLINE]-> 0..n of (fieldref-field-datatype-group) 链。

有什么想法吗?

Man*_*dez 5

根据http://docs.neo4j.org/chunked/milestone/query-match.html上的 Cypher 参考...

12.2.13. 可变长度关系可以使用以下语法找到关系数量可变的节点?节点跃点距离:-[:TYPE*​​minHops..maxHops]->。minHops 和 maxHops 是可选的,分别默认为 1 和无穷大。当没有给出边界时,可以省略点。

我认为您寻求的示例如下。我将最小值设置为两个。

start n=node:node_auto_index(name='Neo') match n-[r:KNOWS*2..]-m return n as Neo,r,m
Run Code Online (Sandbox Code Playgroud)

您可以在http://console.neo4j.org逐字测试此查询