我是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,则应排除它。
如果有答案,它会扩展到大数吗?
感谢。
答案 0 :(得分:1)
在这个答案中,我认为:
:A
和:B
,并具有id
属性。
(: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集合进行了硬编码。)
查询说明,依次为:
:A
节点的所有:B
个节点,其ID为{ids}
集合。:A
个节点,以便最终得到不同的:A
个节点(需要一个或多个感兴趣的:B
个节点)。:B
节点所需的所有:A
个节点。 (其中一些:B
节点可能不感兴趣。):A
个节点与其所有必需:B
个节点的集合相关联。:A
个不感兴趣的节点的:B
个节点。:A
个节点的:B
个节点的ID。假设您为:B(id)
创建索引,此查询应该是可扩展的。