Neo4j:传递查询和节点排序

时间:2014-07-08 19:47:38

标签: neo4j cypher graph-traversal

我正在使用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)。

1 个答案:

答案 0 :(得分:4)

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

您撰写的查询将返回所有可能的"路径"与该模式匹配的节点但是,鉴于您已指定每个此类节点最多只有一个:EXTENDS边缘,所以订单会隐含在您查询中包含的方向。

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

它会做什么,是给你所有"子路径"一条路。也就是说,假设你指定了你想要节点" 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)

或者其他一些。

HTH