2

我正在使用 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在这种情况下)。

4

1 回答 1

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)

或者一些这样的。

高温高压

于 2014-07-08T20:16:57.563 回答