【问题标题】:Neo4j ShortestPath to any node with a given propertyNeo4j ShortestPath 到具有给定属性的任何节点
【发布时间】:2018-08-12 23:42:55
【问题描述】:

我正在尝试在 Neo4j 中使用 ShortestPath。 我想为每个节点找到它到具有给定属性的任何节点的最短路径。

换句话说,对于任何节点 n1,我想要到具有特定属性的任何节点 n2、n2 的最短路径的最小长度。 我目前使用以下查询,但我认为它效率低下,因为它必须计算 n1 和 n2 之间的所有最短路径。更聪明的方法是,一旦我们找到length(path)==1 这样的路径,就停止查找。

MATCH path = shortestpath((n1:Node {has_ppt: False})-[:KNOWS]-(n2:Node {has_ppt: True}))
RETURN n1,n2,length(path)
LIMIT 5

有谁知道如何以不同的方式做到这一点?谢谢

【问题讨论】:

  • 您的图中有多少 n2 节点(具有该特定属性)?
  • n1 ~1M 和 n2~10k。

标签: neo4j cypher shortest-path


【解决方案1】:
  1. 您的-[:KNOWS]- 模式未指定可变长度路径(如-[:KNOWS*..5]-),因此您的shortestpath 查询当前仅尝试查找长度为1 的路径。这可能不是您想要的。

  2. 您可能想尝试一种迭代方法来查找最短路径的单个实例。也就是说,重复执行以下查询(同时增加[:KNOWS*1] 模式中的数字,以增加所需的路径长度)直到得到结果:

    MATCH path = (n1:Node {has_ppt: False})-[:KNOWS*1]-(n2:Node {has_ppt: True})
    RETURN n1,n2,length(path)
    LIMIT 1;
    

【讨论】:

  • 对不起,我忘记了,但我通常将限制设置为 10。好主意,但这需要对查询进行参数化并根据彼此编写一系列查询。谢谢
  • 实际上,由于 Cypher 不允许您对可变长度边界进行参数化(例如,[:KNOWS*1] 中的 1),因此您实际上必须在每次迭代时生成一个新查询。但选项 2 可能仍然是获得答案的最简单方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多