Neo4j:传递查询和节点排序



我使用Neo4j来跟踪OOP架构中的关系。让我们假设节点代表类和(u) -[:EXTENDS]-> (v),如果u类扩展v类(即每个节点最多有一条EXTENDS型的出边)。我正试图找出一个给定类(n)的前身类链。我使用了以下Cypher查询:

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

我需要按照这样的顺序处理节点:类n的直接前身先来,它的前身是第二个,等等。似乎Neo4j引擎按照这个顺序返回节点(给定上面的查询)——我应该依赖这个还是这种行为会在未来的一些版本中突然改变?

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

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

这将工作得很好,但我想避免指定根类(在本例中为Object)。

不太可能很快改变,因为这是图数据库工作的本质。

您编写的查询将返回与该模式匹配的节点的所有可能的"路径"。但是考虑到您已经指定了每个这样的节点最多有一个:EXTENDS边,那么顺序与您在查询中包含的方向一致。

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

它会给你一个路径的所有子路径。也就是说,假设您指定了节点"a"的前身,用于以下路径…

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

…您的查询(省略属性名称)将返回"a, b, c"one_answers"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)

或诸如此类的

HTH

最新更新