Neo4j:取两个 MATCH 的交集

Neo4j: Take intersection of two MATCHs

我有以下两个问题:

MATCH (s1: location)-[:SHIPS_TO]->(: midLocation)-[: LEAVES]->(d1: location)
RETURN s1.name, count(d1)
MATCH (s2: location)-[:SHIPS_TO]->(: midLocation)-[: LEAVES]->(d2: location)
WHERE s2.manager = d2.manager 
RETURN s2.name, count(d2)

我想做的是 return 这两个查询的交集。我真正想做的是找到所有只运送到具有相同经理的地点的地点(运送地点由单个 'midLocation' 节点分隔),并且找到两个列表的交集将完成这个,但我似乎找不到实现它的方法。也许这是另一种方法?

如果您有一组谓词,您可以使用 all 检查它们是否全部为真,因此您可以

MATCH (s1: location)-[:SHIPS_TO]->(: midLocation)-[: LEAVES]->(d1: location)
WITH s1, collect(DISTINCT d1) AS destinations
WHERE all(d IN destinations WHERE d.manager = s1.manager)
RETURN s1.name, size(destinations)

这将过滤掉所有具有与其目标不同的经理的源位置。 请注意,这不是最佳选择,因为在检查它们是否具有相同的管理器之前,您仍然会找到每个位置对。最好找到一种方法,让第一个匹配语句在使用不同的管理器找到目的地后立即失败,但我认为这在纯 Cypher 中是不可能的。