Neo4J - 查找节点,其中相关节点是子集

3

我对Neo4J和图数据库非常陌生。

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

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

例如给定数据集:

typeA,rel,typeB

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

A2,REQUIRES,B1
A2,REQUIRES,B4

A3,REQUIRES,B4

A4,REQUIRES,B5

我希望您能够翻译以下问题:给定Bs列表中哪些As完全被覆盖?
示例:
 given B1,B2,B3 -> A1
 given B1,B3,B4 -> A2, A3
 given B1,B3,B4,B5 -> A2, A3, A4

如果给定的B列表不包含A相关的所有B,则应将其排除。
如果有一个答案,它是否适用于大量数据?
谢谢。
1个回答

1
在本答案中,我假设:
  • 节点被标记为: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

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

查询的说明,按顺序:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接