gpt4 book ai didi

Neo4J - 查找相关节点是子集的节点

转载 作者:行者123 更新时间:2023-12-02 03:30:15 24 4
gpt4 key购买 nike

我对 Neo4J 和图形数据库还很陌生。

如果我有一个非常简单的图,其中节点 A 需要 1 到多个节点 B。

有没有一种有效的方法可以找到那些节点 As,其中与 B 相关的节点是给定列表的子集。

例如给定的数据集:

typeA,rel,typeB

A1,REQUIRES,B1
A1,REQUIRES,B2
A1,REQUIRES,B3

A2,REQUIRES,B1
A2,REQUIRES,B4

A3,REQUIRES,B4

A4,REQUIRES,B5

我想问的是给定的 B 列表完全覆盖了哪些 A

例子:

 given B1,B2,B3 -> A1
given B1,B3,B4 -> A2, A3
given B1,B3,B4,B5 -> A2, A3, A4

如果给定的 B 列表不包含与 A 相关的所有 B,则应将其排除。

如果有答案,它会扩展到大数吗?

谢谢。

最佳答案

在这个回答中,我假设:

  • 节点标记为:A:B,并具有id 属性。
    • 例如,“A1”将是 (:A {id: 1})
  • 您在 {ids} 参数中传递一组感兴趣的 :B ID。

下面的查询应该做你想做的。

MATCH (a:A)-[:REQUIRES]->(b:B)
WHERE b.id IN {ids}
WITH DISTINCT a
MATCH (a)-[:REQUIRES]->(bb:B)
WITH a, COLLECT(bb) AS bbs
WHERE ALL(x IN bbs WHERE x.id IN {ids})
RETURN a.id

Here is a console如果感兴趣的 :B ID 集合是 [1, 3, 4, 5],它会显示结果,这与您的最后一个示例相匹配。 (由于控制台不支持传递参数,所以我硬编码了查询中的ID集合。)

查询的描述,按顺序:

  1. (前 2 行)找到所有需要 :B 节点且 ID 为 {ids} 集合的 :A 节点。
  2. 删除重复的 :A 节点,以便我们最终得到不同的 :A 节点(需要一个或多个 :B 节点兴趣)。
  3. 找到每个 :A 节点所需的所有 :B 节点。 (其中一些 :B 节点可能不重要。)
  4. 将每个 :A 节点与其所需的所有 :B 节点的集合相关联。
  5. 过滤掉所有需要不感兴趣的:B节点的:A节点。
  6. 返回只需要感兴趣的:B节点的:A节点的ID。

假设您为 :B(id) 创建了一个索引,这个查询应该是可扩展的。

关于Neo4J - 查找相关节点是子集的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27376831/

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