2017-07-14 73 views
2

有了这个模型:获取相关的特定节点的所有节点,但不是另一个

(: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) 

我需要一个等效的查询,返回乔希和马克有和卡尔和罗杰没有的电影。

任何消化?

+0

你需要考虑乔希有的电影,但是马克,卡尔和罗杰没有? –

回答

2

,您可以避免为不同的名称组合修改Cypher代码。

例如:

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); 

DISTINCT关键字用于消除重复。

0

你可以尝试这样的事情:

// 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) 
1

可以使用NONE断言:如果你通过你的人,名单为2 parameters(比如,yesno

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) 
相关问题