Neo4j cypher查询链表

时间:2013-08-13 17:00:36

标签: graph neo4j cypher property-graph

我有下图。联赛(l1)以 LEVEL r1开头, NEXT 级别使用 NEXT 关系进行关联,如图所示。

league-[:LEVEL]->r1-[:NEXT]->r2-[:NEXT]->r3-[:NEXT]->r4

我正在寻找的是找到给定联赛和顺序中的所有等级。因此,对于上图,预期输出为r1, r2, r3, r4。我有以下查询,但它返回所有路径。

start l1=node(9)  match l1-[:level]->(level) with level match p=level-[:next*]->(remainingLevels) return p;

Cyphers用于创建此图表。这已在console.neo4j.org上设置(请务必更改ID)

CREATE (l1 {name: 'l1'}) return l1;
CREATE (r1 {name: 'r1'}) return r1;
START l1=node(9), r1=node(10) CREATE l1-[r:level]->r1;
CREATE (r2 {name: 'r2'}) return r2;
START r1=node(10), r2=node(11) CREATE r1-[r:next]->r2;
CREATE (r3 {name: 'r3'}) return r3;
START r2=node(11), r3=node(12) CREATE r2-[r:next]->r3;
CREATE (r4 {name: 'r4'}) return r4;
START r3=node(12), r4=node(13) CREATE r3-[r:next]->r4;

3 个答案:

答案 0 :(得分:4)

我清理了您的数据集并尝试了答案here

MATCH league-[r:level|next*]->(level) 
WHERE league.name?="l1" 
RETURN level, length(r) AS Dist, r 
ORDER BY length(r)

查询从联盟(l1)开始,并在所有:level和:next路径中追踪,然后返回找到的节点,这些节点按照从起始节点到达它的路线的距离排序。

请注意,这会找到所有可能的路线,因此如果有多种方式可以到达关卡,那么它将无法正常工作。也就是说,看起来您的图形非常像树状(没有周期),这样可以正常工作。

这是一个2.0查询,因为它依赖于WHERE查询来利用指标来获取图中的起始节点(l1)。

答案 1 :(得分:1)

我设法使用以下查询。

start l1=node(9) 
match l1-[:level]->(level) 
with level 
match p = level-[:next*]->(remainingLevels) 
with level, max(length(p)) as maxlen 
match p = level-[:next*]->(remainingLevels) 
where length(p)=maxlen
return nodes(p);

输出

+-----------------------------------------------------------------------------------+
==> | nodes(p)                                                                          |
==> +-----------------------------------------------------------------------------------+
==> | [Node[10]{name:"r1"},Node[11]{name:"r2"},Node[12]{name:"r3"},Node[13]{name:"r4"}] |
==> +-----------------------------------------------------------------------------------+

欢迎任何简化或优化。

答案 2 :(得分:1)

这个查询怎么样,

匹配p =联赛1 - [:级别] - >(级别) - [:next *] - > endLevel

WHERE league1.name?='l1'和NOT(endLevel - [:next] - >())

RETURN tail(节点(p))