提问者:小点点

Neo4j:传递查询和节点排序


我正在使用Neo4j来跟踪OOP架构中的关系。让我们假设节点表示类和(u)-[: EXTENDS]-

start n=node(...)
match (n) -[:EXTENDS*]-> (m)
return m.className

我需要按这样的顺序处理节点,即classn的直接前身排在第一位,其前身排在第二位等。似乎Neo4j引擎以完全相同的顺序返回节点(给定上述查询)-这是我应该依赖的东西,还是这种行为会在未来的一些版本中突然改变?

如果我不应该依赖此行为,什么Cypher查询将允许我以给定顺序获取所有前置节点?我正在考虑以下查询:

start n=node(...)
match p = (n) -[:EXTENDS*]-> (m {className: 'Object'})
return p

这工作得很好,但我想避免指定根类(在这种情况下为Object)。


共1个答案

匿名用户

它不太可能很快改变,因为这确实是图形数据库在工作的性质。

您编写的查询将返回与该模式匹配的节点的所有可能“路径”。但鉴于您已指定每个此类节点最多有一个:扩展边,顺序与您在查询中包含的方向隐含。

换句话说,返回的内容不会开始“跳过”链中的节点。

但是,它将为您提供路径的所有“子路径”。也就是说,假设您指定了节点“a”的前辈,用于以下路径……

(a)-[:EXTENDS]->(b)-[:EXTENDS]->(c)

…您的查询(省略属性名称)将返回“a, b,c”和“a,b”。如果您只想要其所有前身,并且可以使用Cypher 2.x,请考虑使用“路径”方式,类似于:

MATCH p = (a)-[:EXTENDS*]->(b)
WITH p
ORDER BY length(p) DESC
LIMIT 1
RETURN extract(x in nodes(p) | p.className)

此外,作为最佳实践,考虑到您正在查看不确定长度的路径,您可能应该将查询的跳数限制在合理的范围内,例如。

MATCH (n) -[:EXTENDS*0..10]-> (m)

或者一些这样的。

宏达