【问题标题】:How do I find pairs of nodes that are not connected in n hops?如何找到在 n 跳中未连接的节点对?
【发布时间】:2015-11-03 09:21:05
【问题描述】:

正如标题所说,我有一个节点图,这些节点与关系 N 相互连接。我现在想找到彼此相距超过 20 跳的所有节点对。

使用以下密码查询的幼稚方法太慢了:

MATCH (n:CELL) 
WITH n 
MATCH (k:CELL) 
WHERE NOT (n)-[:N*1..20]->(k) 
RETURN n, k

我可以创建具有“距离”属性的第二个关系 K,然后匹配它,但是对于每个节点这样做并不能很好地扩展(我有 18k 个节点,所以我需要超过 1.6 亿个节点新关系)。

neo4j 有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您可以尝试使用更有效的最短路径。

    MATCH (n:CELL) 
    WHERE shortestPath((n)-[:N*..20]->(k:CELL)) IS NULL
    RETURN n, k
    

    【讨论】:

    • 您的查询中没有与 k 匹配的内容 - 这仍然会出现在 WHERE 子句之前,对吧?我认为这是主要的性能问题,因为它需要 18k 个节点中的所有两个节点对,这意味着我选择了大约 3.2 亿个节点对......
    【解决方案2】:

    这样的事情怎么样:

    MATCH p=((n:CELL-[:N*..20]->(k:CELL))
    WITH n, k, min(length(p)) as minDinstance
    WHERE minDinstance > 20/2 AND n <> k
    RETURN DISTINCT n, k, minDinstance
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多