Graph 链表的Neo4j密码查询

Graph 链表的Neo4j密码查询,graph,neo4j,cypher,property-graph,Graph,Neo4j,Cypher,Property Graph,我有下面的图表。联赛(l1)以级别r1开始,而下一个级别使用下一个关系进行关联,如图所示 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=leve

我有下面的图表。联赛(l1)以级别r1开始,而下一个级别使用下一个关系进行关联,如图所示

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;
用于创建此图的密码。此设置已在上设置(请确保更改id)


我通过下面的查询成功地实现了这一点

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"}] |
==> +-----------------------------------------------------------------------------------+

欢迎进行任何简化或优化。

我清理了您的数据集,并尝试回答:

该查询从一个联盟(l1)开始,跟踪所有:level和:next路由,然后返回找到的节点,这些节点按照从起始节点到达的路由的距离排序

注意,这会找到所有可能的路径,因此如果有多种方法可以到达该级别,则不会很好地工作。这就是说,您的图形看起来非常像树(没有循环),这将很好地工作

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

这个查询如何

比赛p=league1-[:level]->(level)-[:next*]->endLevel

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


RETURN tail(nodes(p))

如果您能在console.neo4j.org上设置一些我们可以使用的东西,那将非常有用。@Edward在console.neo4j.org上完成了节点和关系的设置。我也运行了我的查询,以确保它工作正常。请检查并查看是否可以找到简化或优化的查询。您应该在该页面上有一个“共享”按钮。如果你能把这个链接链接到你的问题中,我会查出来的。@Edward给你:这在1.8.2中运行,但在console.neo4j.org中,这将返回第一个节点“r1”两次,因此需要使用尾部(节点(p))。不知道为什么会有这种行为上的差异。你有控制台链接可以查看吗?@MichaelHunger-这是console.neo4j.org/r/gi6zz3即使在转换了LEVEL和NEXT之后也不会返回任何内容。我修改了查询以精确匹配控制台中的图形,匹配p=league1-[:LEVEL]>(LEVEL)-[:NEXT*]->endLevel,其中league1.name?=“l1”和“NOT”(endLevel-[:next]->())返回尾部(节点(p))
+-----------------------------------------------------------------------------------+
==> | nodes(p)                                                                          |
==> +-----------------------------------------------------------------------------------+
==> | [Node[10]{name:"r1"},Node[11]{name:"r2"},Node[12]{name:"r3"},Node[13]{name:"r4"}] |
==> +-----------------------------------------------------------------------------------+
MATCH league-[r:level|next*]->(level) 
WHERE league.name?="l1" 
RETURN level, length(r) AS Dist, r 
ORDER BY length(r)