【问题标题】:intersection of two set of nodes (neo4j cypher traversal path)两组节点的交集(neo4j 密码遍历路径)
【发布时间】:2017-05-30 22:22:32
【问题描述】:

我有一个由关系相互连接的 100000 个节点的图。 从 A 点到 B 点,只有一个可能的路径,在我的模型中不可能有环路。

我正在寻找一种解决方案,该解决方案将指示节点列表的路径是否与第二个节点列表的路径相交

如果有交叉点,我不需要知道交叉点。

是否有可能在不遍历整个图的情况下找到解决方案(一旦找到第一个节点就停止)?

示例:picture of graph

节点1列表:红色节点

节点列表 2:蓝色节点

由于至少有一个交叉点(黑色节点),所以请求必须返回true。

密码请求:

编辑:密码请求

match path=shortestPath((n1)-[r*]-(n2))
where id(n1) = node1 and id(n2) in nodesList1
with nodes(path) as nodespath1

match path=shortestPath((n1)-[r*]-(n2))
where id(n1) = node2 and id(n2) in nodesList2
with nodespath1, nodes(path) as nodespath2

with ANY (n IN nodespath1 WHERE n IN nodespath2) AS conflit
with ANY (n IN collect(conflit) WHERE n = true) AS conflit
RETURN conflit;

【问题讨论】:

  • “节点列表的路径”是什么意思?您的意思是“从列表中获取的所有可能的节点对之间的所有路径”,还是“从列表中获取的所有可能的节点对之间的任何路径”,或者“包含列表中每个节点的所有路径”,或者什么还有吗?
  • 节点列表的路径是指列表中所有节点对之间的最短路径(只有一个可能的路径)

标签: neo4j cypher traversal


【解决方案1】:

由于任何一对节点之间只有一个可能的路径,我认为您的图是一棵树,您可以选择任意节点作为该树的根。

完成此操作后,线性时间预处理工作可让您在恒定时间内回答最低共同祖先查询,并且任何两个节点之间的路径包括将树上升到其最低共同祖先的路径,然后是下树的路径。我们称这个峰——路径两端的最低共同祖先——路径的最低共同祖先。

如果单个节点 N 在路径上,则该节点的最低共同祖先和该路径的最低共同祖先是路径的最低共同祖先,并且该节点的最低共同祖先和端点之一路径的最重要的是节点 N。此外,如果这两个条件都成立,则节点 N 位于路径的最低共同祖先和路径的端点之一之间,因此它在路径上 - 你已经找到了在 O(1) 时间内完成。

如果两条路径相交,则具有最低共同祖先的路径必须在另一条路径上有该祖先,否则它将完全位于另一条路径之下 - 上面的段落显示了如何在 O(1) 时间内计算出是否任意节点在路径上,因此我们可以通过查看任一路径的最低共同祖先是否在另一路径上来检查路径交叉点。

【讨论】:

    【解决方案2】:

    要将一组路径合并到一个节点池中,您可以使用 UNWIND n + COLLECT(DISTINCT n)。以下是调整示例查询的方法。

    match path=shortestPath((n1)-[r*]-(n2))
    where id(n1) = node1 and id(n2) in nodesList1
    UNWIND nodes(path) as nodespath1
    WITH collect(DISTINCT nodespath1) as nodespath1
    
    match path=shortestPath((n1)-[r*]-(n2))
    where id(n1) = node2 and id(n2) in nodesList2
    UNWIND nodes(path) as nodespath2
    WITH nodespath1, collect(DISTINCT nodespath2) as nodespath2
    
    with ANY (n IN nodespath1 WHERE n IN nodespath2) AS conflict
    RETURN conflict;
    

    当然,在您的情况下,如果路径相交,则存在从红色到红色和蓝色的路径。到目前为止更简单

    MATCH (a), (b)
    WHERE id(a) in nodesList1 AND id(b) in nodesList2
    // Match a c node in path to an a and a b node
    MATCH (a)-[*]-(c)-[*]-(a2), (b)-[*]-(c)-[*]-(b2)
    WHERE id(a2) in nodesList1 AND id(b2) in nodesList2
    WITH c
    LIMIT 1
    RETURN (COUNT(c) == 1) as conflict
    

    【讨论】:

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