在Neo4J中使用密码找到未知距离的节点的有效方法?

时间:2015-06-11 14:19:11

标签: neo4j cypher

假设我已经匹配了一个起始节点,现在有了它的id。

接下来,我想查找到具有特定标签的起始节点的传入路径的所有节点。我不知道"遥远的"具有该标签的节点是(但认为它们将少于20个节点)。如果任何带有该标签的相关节点,那么它们距离都相同。

目前我正在做:

MATCH (l:`mylabel`)-[*1..20]->(start) where id(start) = 1016236 RETURN l

但我猜这可能是浪费,低效和缓慢。

我可以做类似的事(在伪代码中):

for $i in (1..20) {
    @ls = run_cypher("MATCH (l:`mylabel`)-[*1..$i]->(start) where id(start) = 1016236 RETURN l")
    last if @ls
}

但这需要多个单独的查询,但仍然很浪费。

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

如果它们都在同一深度,您可以使用LIMIT 1进行查询,然后在该深度进行查询:

MATCH path=shortestPath((l:`mylabel`)-[*1..20]->(start))
WHERE id(start) = 1016236
RETURN min(length(rels(path))) AS min_depth

然后您可以使用该深度进行查询:

MATCH path=(l:`mylabel`)-[*$i..$i]->(start)
WHERE id(start) = 1016236
RETURN l

我很想知道这是否表现更好。老实说,因为Neo4j针对图形遍历进行了优化,它可能没有太大的区别,但它取决于你的图形。它现在的表现如何?