在Neo4J中使用cypher查找未知距离节点的有效方法?

在Neo4J中使用cypher查找未知距离节点的有效方法?,neo4j,cypher,Neo4j,Cypher,假设我已经匹配了一个开始节点,现在有了它的id 下一步,我想找到沿传入路径到我的开始节点的所有具有特定标签的节点。我不知道有这个标签的节点“距离”有多远(但我认为它们距离不到20个节点)。如果存在具有该标签的任何相关节点,则它们之间的距离都相同 目前我正在做: MATCH (l:`mylabel`)-[*1..20]->(start) where id(start) = 1016236 RETURN l 但我猜这可能是浪费、低效和缓慢的 我可以这样做(在psuedo代码中): 但这需要多

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

下一步,我想找到沿传入路径到我的开始节点的所有具有特定标签的节点。我不知道有这个标签的节点“距离”有多远(但我认为它们距离不到20个节点)。如果存在具有该标签的任何相关节点,则它们之间的距离都相同

目前我正在做:

MATCH (l:`mylabel`)-[*1..20]->(start) where id(start) = 1016236 RETURN l
但我猜这可能是浪费、低效和缓慢的

我可以这样做(在psuedo代码中):

但这需要多个单独的查询,而且仍然是浪费


有更好的解决方案吗?

如果它们都在同一深度,您可以使用
限制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是为图形遍历而优化的,所以它可能不会有太大的区别,但这取决于您的图形。它现在的性能如何?

你是说,如果任何路径都有带有该标签的节点,那么所有路径都会有带有该标签的节点,并且位置完全相同?实际上,如果有多个深度,我只想要最低深度的节点你能分享更多关于你正在查询的模型的信息吗?除非您的图形非常不寻常(或前所未有的大),否则您不可能从深度20遍历中得到任何有用的东西。几乎可以肯定,您正在遍历整个图形。我希望有长的线性链。我有(非字面意义上的)父->子关系,可能有很多“世代”,我的起点是一个未知的世代,我想从某个孩子走到某个祖先。不幸的是,事情更复杂,而且不总是只有一条路径可以做到这一点。我的simple*1..20的性能糟糕得令人不安:返回时间为75秒,而如果我知道它的深度后使用了正确的深度,则返回时间为~瞬间(*1..6)。您的建议在不到一秒的时间内返回,但回答错误-它给出了10。(*10..10)返回与(*6..6)相同的节点,因此平均有两条路径指向我的节点,并且我被告知路径较长。(*10..10)是一种比~瞬发(*6..6)慢的触摸,因此如果有一种方法可以获得最小的深度,那就太好了……对不起,我错了。深度6和深度10处的节点不同。不知道现在该做什么…实际上,如果有多个深度,我只希望节点处于最低深度。那么,关于如何快速获得最小深度有什么想法吗?或者我如何排除包含具有特定标签(或特定类型的关系)的节点的路径,而不是最小深度?
MATCH path=(l:`mylabel`)-[*$i..$i]->(start)
WHERE id(start) = 1016236
RETURN l