【问题标题】:neo4j shortest path with label constraint带有标签约束的neo4j最短路径
【发布时间】:2017-11-21 06:34:33
【问题描述】:

希望了解是否可以采取任何措施使下面的查询在大图上表现出色。我试图找到两个节点之间的最短路径,但排除包含某些其他类型节点的路径。问题似乎是 WHERE 子句。下面的查询完全停止了。

MATCH p=shortestPath((p1:Party{suprRC:"21"})-[*..15]-(p2:Party{suprRC:"21"}))
WITH p
WHERE NONE(n in nodes(p) where labels(n) in [["Reporter"],["FirstName"],["LastName"]]) 
RETURN p limit 500;

【问题讨论】:

  • 您可以直接在 MATCH 上尝试 WHERE(换句话说,不要使用 WITH p)。
  • 感谢汤姆的建议 - 恐怕它没有帮助。
  • 几个问题...... 1)起始节点和结束节点......相同吗? suprRC 是 Party 的独特属性吗?如果没有,是否在 suprRC 上索引了 Party 节点(我知道这应该很明显,我只是在这里排除选项)?当您只执行 MATCH (使用 RETURN 和 LIMIT 但没有 WITH 和 WHERE)时......那是高性能的吗?你能分享这个查询的 EXPLAIN 的输出吗?
  • Hi Tom - 1) 起始节点和结束节点不相同。 suprRC 对于一个派对来说并不是唯一的。我还没有为派对节点建立索引——我知道我应该这样做,但是由于当我添加过滤节点标签路径的片段时查询会终止,我有理由相信这不是问题。当我省略 WHERE 和 WITH 部分时,它非常高效。事实上,最后两个节点排除项,尤其是“FirstName”,会影响性能。
  • 看起来我还不能向 SO 添加图像。它足够短,这是我的 ascii 版本:

标签: neo4j shortest-path


【解决方案1】:

比较错误,labels(n) 返回一个标签集合,您将把一个集合与单个 String 元素的集合进行匹配。

正如 Tom 所说,您可以不使用 WITH,但必须使用两个 NONE 谓词

MATCH p=shortestPath((p1:Party{suprRC:"21"})-[*..15]-(p2:Party{suprRC:"21"}))
WHERE NONE(x IN nodes(p) 
             WHERE NONE(l IN ['Reporter','LastName', 'FirstName'] 
                      WHERE l IN labels(x)
                      )
          )
RETURN p limit 500;

【讨论】:

  • 感谢克里斯托夫的建议。我不记得为什么我使用了我所做的特定习语 - 尽管它确实有效(无论如何都有更小的图形/查询)。我尝试了您建议的那个,它也有效,但仍然太慢(查询完成需要 30 分钟)。呃。
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多