用Cypher查询Neo4j中的递归关系链

时间:2013-05-23 16:06:14

标签: neo4j cypher relationships

我有一个图形数据库,它为消息的元数据和可以包含在这些消息中的字段建模。这些字段中的一些可以是“组”,其是其他字段的组。我试图问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)

第二个链是递归的。换句话说, - [:FIELDREF] - >(fref) - [:FIELD] - >(字段) - [:DATATYPE] - (组)段可以在最终到达组I'之前反复发生我很感兴趣。

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

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

START group=node({sourceGroupId})
... ? ? ? ...

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

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

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

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

我认为你寻求的一个例子如下。我将最小值设置为2。

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

您可以在http://console.neo4j.org

逐字测试此查询