gpt4 book ai didi

neo4j - 匹配仅与两个特定节点相关的所有节点

转载 作者:行者123 更新时间:2023-12-02 08:15:13 25 4
gpt4 key购买 nike

我有 100 个标签为 A 的节点和 2 个标签为 B 的节点。所有标签为 A 的节点都与至少一个标签为 B 的节点相关。如何让标签 A 的所有节点都与标签 B 的两个节点相关?我尝试了以下方法:

MATCH p=(:A)-[:TYPE]->(b:B) where b.Name = 'XYZ' or b.Name = 'ABC'
RETURN p

这只会给我与这两个节点中的任何一个相关的所有节点。

编辑:我已经设法通过使用以下查询来做到这一点:

MATCH (a:A)- [:TYPE] ->(t:Type) where t.Name = 'ABC'
MATCH (a:A)- [:TYPE] -> (u:Type) where u.Name = 'XYZ'
return a, t, u

有没有办法优化这个?

最佳答案

有几种方法可以做到这一点。

如果 :A 节点上的 :TYPE 关系只连接到 :B 节点,并且每个 :A 和 :B 节点之间只有一个 :TYPE 关系,那么最快的方法是根据 :TYPE 的程度进行过滤来自 :A 节点的关系:

MATCH (a:A)
WHERE SIZE((a)-[:TYPE]->()) = 2
RETURN a

如果 :TYPE 关系不仅仅是 :B 节点,那么您可以稍微更改查询。它不会那么高效,但可以正常工作:

MATCH (a:A)
WHERE SIZE((a)-[:TYPE]->(:B)) = 2
RETURN a

如果 :B 节点的数量增加,并且您想找到连接到所有 :B 节点的 :A 节点,那么我们可以使用集合以及 ALL() 函数来获取正确的 :A 节点集:

MATCH (b:B)
WITH COLLECT(b) as bnodes
MATCH (a:A)
WHERE ALL(b in bnodes WHERE (b)<-[:TYPE]-(a))
RETURN a

如果您只需要 :B 节点的一个子集,而不是全部,那么您可以根据一组 id 过滤您的初始匹配:

// assuming you supply a list parameter of ids called 'ids'
MATCH (b:B)
WHERE b.id in {ids}
WITH COLLECT(b) as bnodes
WITH HEAD(bnodes) as first, bnodes
MATCH (a)-[:TYPE]->(first)
WHERE ALL(b in TAIL(bnodes) WHERE (b)<-[:TYPE]-(a))
RETURN a

其中有一些额外的逻辑只需要考虑:A 节点是您的 b 节点中元素之一的类型。这样我们就不会考虑 :A 节点与您的任何 bnode 都不相关,从而避免执行不必要的比较。

关于neo4j - 匹配仅与两个特定节点相关的所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42638221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com