Neo4j 获取与特定节点相关但与其他节点无关的所有节点

Neo4j 获取与特定节点相关但与其他节点无关的所有节点,neo4j,cypher,Neo4j,Cypher,拥有这种型号: (:Person)-[:has]-(:Movie) 我需要得到一个任意群体拥有的所有电影,而另一个群体没有 我从以下几点开始: MATCH (p1.Person {Name: 'Josh'})-[:has]->(m:Movie) WHERE not exists ((p2:Person {Name: 'Carl'})-[:has]->(m)) RETURN COUNT(m) 我得到p1有和p2没有的电影数量。 问题是,我需要的是团体,而不是个人;比如: MATCH

拥有这种型号:

(:Person)-[:has]-(:Movie)
我需要得到一个任意群体拥有的所有电影,而另一个群体没有

我从以下几点开始:

MATCH (p1.Person {Name: 'Josh'})-[:has]->(m:Movie)
WHERE not exists ((p2:Person {Name: 'Carl'})-[:has]->(m))
RETURN COUNT(m)
我得到p1有和p2没有的电影数量。 问题是,我需要的是团体,而不是个人;比如:

MATCH (p1.Person {Name: ['Josh','Mark]})-[:has]->(m:Movie)
WHERE 
not exists ((p2:Person {Name: ['Carl','Roger']})-[:has]->(m))
RETURN COUNT(m)
我需要一个等价的查询来返回Josh和Mark拥有而Carl和Roger没有的电影


有什么建议吗?

您可以尝试以下方法:

// Match p1 (Josh and Mark)
MATCH (p1:Person)
WHERE p1.name in ['Josh','Mark']
// Match p2 (Carl and Roger)
MATCH (p2:Person)
WHERE p2.name in ['Carl','Roger']
// Match movies that p1 group have but p2 does not
MATCH (p1)-[:has]->(m:Movie)
WHERE NOT (p2)-[:has]->(m:Movie)
// return the count
RETURN COUNT(m)

您可以使用
NONE
谓词:

MATCH (person:Person) WHERE person.Name IN ['Carl', 'Roger']
WITH collect(person) AS blacklist
MATCH (p1:Person)-[:has]->(m:Movie)
WHERE p1.Name IN ['Josh', 'Mark']
AND NONE 
    ( p2 IN blacklist
         WHERE EXISTS( (p2)-[:has]->(m)) 
    )
RETURN COUNT(m)

如果将人名列表传递为2(例如,
yes
no
),则可以避免修改不同姓名组合的密码

例如:

MATCH (p1:Person)-[:has]->(m1:Movie)
WHERE p1.Name IN $no
WITH COLLECT(DISTINCT m1) AS blacklist
MATCH (p2:Person)-[:has]->(m2:Movie)
WHERE p2.Name IN $yes AND NOT (m2 IN blacklist)
RETURN COUNT(DISTINCT m2);

<> >代码>区分< /COD>关键字被用来消除重复。

你需要考虑Josh所拥有的电影,但是马克、卡尔和罗杰没有?