2017-10-07 68 views
1

我想在neo4j瀏覽器中顯示一個網絡。如何返回節點相關的一組節點,但不是彼此

我有一個圖,其中節點是Person,並且存在兩種類型的關係MANAGEDFRIENDS

給出一個初始的人ID爲'123'我可以找到所有他們遞歸管理的人,像這樣

MATCH (p:Person { person_id:"123" })-[r:MANAGES *0..100]->(managed:Person) 
RETURN managed,r 

我想現在要做的是顯示所有這些人,所有的管理的箭頭,但此外,還會顯示與managed人和friends箭頭之間的關係爲FRIENDS的所有人。但是我不想在managed中的人與managed中的其他人之間顯示FRIENDS箭頭,即使存在FRIENDS關係。

一些非功能性的僞代碼可能是

MATCH (p:Person { person_id:"123" })-[m:MANAGES *0..100]->(managed:Person)-[f:FRIENDS]-(friend:Person) 
RETURN managed,m, f if friend not in managed, friend if friend not in managed 

回答

0

您需要使用到付凝結的結果轉換成列表,這樣就可以在上面運行的過濾器。 (functions

MATCH (p:Person { person_id:"123" })-[m:MANAGES *0..100]->(managed:Person)-[f:FRIENDS]-(friend:Person) 
// m is already a list because *..100, so need to unpack it to consolidate repeated values 
UNWIND m as ms 
WITH COLLECT(DISTINCT p) as p, COLLECT(DISTINCT ms) as m, COLLECT(DISTINCT managed) as managed, COLLECT(DISTINCT f) as f, COLLECT(DISTINCT friend) as friend 
RETURN managed, m, FILTER(r in f WHERE NOT r in m) as f, FILTER(n in friend WHERE NOT n in managed) as friend 

你可以用悠閒地一些過濾器,以獲得行回來,但這需要一些額外的工作,使返回的數據更大(因爲,例如,對將要返回的時間的行數)。

相關問題