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

时间:2014-12-09 10:36:25

标签: neo4j

我是Neo4J和图形数据库的新手。

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

是否有一种有效的方法来查找那些节点与它们相关的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 个答案:

答案 0 :(得分:1)

在这个答案中,我认为:

  • 节点标记为:A:B,并具有id属性。
    • 例如,“A1”将为(:A {id: 1})
  • 您传递了:B参数中感兴趣的{ids}个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行)查找需要:A节点的所有:B个节点,其ID为{ids}集合。
  2. 删除重复的:A个节点,以便最终得到不同的:A个节点(需要一个或多个感兴趣的:B个节点)。
  3. 查找每个:B节点所需的所有:A个节点。 (其中一些:B节点可能不感兴趣。)
  4. 将每个:A个节点与其所有必需:B个节点的集合相关联。
  5. 过滤掉所有需要:A个不感兴趣的节点的:B个节点。
  6. 返回仅需要感兴趣的:A个节点的:B个节点的ID。
  7. 假设您为:B(id)创建索引,此查询应该是可扩展的。