繁体   English   中英

两组节点的交集(neo4j密码遍历路径)

[英]intersection of two set of nodes (neo4j cypher traversal path)

我有一个通过关系相互连接的100000个节点的图形。 从点A到点B,只有一条可能的路径,在我的模型中没有循环是可能的。

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

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

是否有可能无需遍历整个图形就能找到解决方案(一旦找到第一个节点就停止)?

示例: 图形图片

节点列表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;

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

完成此操作后,线性时间预处理工作将使您能够在恒定时间内回答最低的公共祖先查询,并且任何两个节点之间的路径都包括一条将树升至其最低公共祖先的路径,然后是从树到其最低祖先的路径。树。 我们将此峰称为-路径两端的最低公共祖先-路径的最低公共祖先。

如果单个节点N在路径上,则该节点的最低公共祖先和该路径的最低公共祖先是路径的最低公共祖先,并且该节点的最低公共祖先和路径的一端之一是节点N。此外,如果这两个条件都成立,则节点N在路径的最低公共祖先与路径的两端之一之间,因此它在路径上-您已经在O中找到了它(1次。

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

要将一组路径合并到节点池中,可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM