2017-07-14 114 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) 
相關問題