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所拥有的电影,但是马克、卡尔和罗杰没有?