密码中的相交/组合匹配

时间:2018-06-28 13:14:37

标签: neo4j cypher

我有一个图,其中绿色节点可以链接到一个或多个红色节点,然后再链接到一组蓝色节点。红色节点还具有amt属性,该属性指示集合中需要匹配的蓝色节点的最小数量,以便“满足”红色节点的需要。如果一组给定的蓝色节点满足所有绿色节点的红色邻居的要求,则它们“有资格”获得绿色节点。

示例

enter image description here

enter image description here

如何编写密码查询以返回给定蓝色节点集的所有合格绿色节点?

我想出了以下内容,如果红色邻居的所有蓝色节点都匹配,则返回绿色节点。但是,除了为每个红色节点指定的amt之外,我不需要全部匹配。

MATCH (g:Green)-->(r:Red)-->(b:Blue)
WITH g, COLLECT(b.name) AS myset
WHERE ALL(n in myset where n in ["1", "2", "3", "4", "8", "9", "11"])
RETURN p

2 个答案:

答案 0 :(得分:2)

首先,您需要找到所有绿色候选对象,然后通过红色节点进行检查:

WITH ["1", "2", "3", "4", "8", "9", "11"] AS blues
MATCH (g:Green)-[:requires]->(r:Red)-[:contains]->(b:Blue) WHERE b.name IN blues

WITH distinct g, blues
MATCH (g)-[:requires]->(r:Red)
OPTIONAL MATCH (r)-[:contains]->(b:Blue) WHERE b.name IN blues

WITH g, r, size(collect(DISTINCT b)) AS bCount
WITH g, collect([r.amt, bCount]) AS test
WITH g WHERe all(t IN test WHERE t[0] <= t[1])
RETURN g

答案 1 :(得分:0)

此查询应返回Green个节点,这些节点的“必需” Red个节点 all 至少具有其各自必需的amt为“包含” {{1 }}节点:

Blue