2016-11-10 62 views
1

我有一個簡化的Neo4j圖(舊版本2.x)作爲具有'定義'和'相同'邊緣的圖像。假定在define邊緣的數目是在邊緣過濾掉兩個密碼路徑上的節點

的查詢一個屬性我想運行有:

1)找到節點由A和B兩者defined - Requried結果:C,C,d

START A=node(885), B=node(996) MATCH (A-[:define]->(x)<-[:define]-B) RETURN DISTINCT x

上述工作並返回C和D.但是我想C鈕兩次,因爲它定義了兩次。但是如果沒有獨立的x,它將返回從A到B的所有路徑。

2)查找非節點(由A,B定義或由A,B定義,但通過同一條邊連接) - 必需的結果:g^

是這樣的:

R1: MATCH (A-[:define]->(x)<-[:define]-B) RETURN DISTINCT x

R2: MATCH (A-[:define]->(e)-(:similar)-(f)<-[:define]-B) RETURN e,f

(用A定義的節點 - (R1 + R2))

3)找到沒有匹配來自A和B的「中間」節點 - 所需結果:C,G

我想輸出C,因爲有1 define(45/46)沒有匹配的來自B. 還輸出g界定,因爲沒有define至G從B. enter image description here

欣賞任何幫助!

+0

您使用的是哪個版本的Neo4j?在你的比賽中缺少的括號看起來不像它應該在Neo4j 3.x中運行。 – InverseFalcon

回答

1

您的語法對我來說有點奇怪,所以我會假設您使用的是舊版本的Neo4j。不過,我們應該可以使用相同的方法。

對於#1,你提出的沒有不同的匹配確實應該工作。我唯一能看到的是在A和B節點變量周圍添加缺失的括號。

START A=node(885), B=node(996) 
MATCH (A)-[:define]->(x)<-[:define]-(B) 
RETURN x 

另外,我不確定你的意思是「返回從A到B的所有路徑」。你能澄清一下,並提供一個輸出的例子嗎?

至於#2,我們需要幾個部分來查詢,用WITH分隔它們。

START A=node(885), B=node(996) 
MATCH (A)-[:define]->(x)<-[:define]-(B) 
WITH A, B, COLLECT(DISTINCT x) as exceptions 
OPTIONAL MATCH (A)-[:define]->(x)-[:same]-(y)<-[:define]-(B) 
WHERE x NOT IN exceptions AND y NOT IN exceptions 
WITH A, B, exceptions + COLLECT(DISTINCT x) + COLLECT(DISTINCT y) as allExceptions 
MATCH (aNode) 
WHERE aNode NOT IN allExceptions AND aNode <> A AND aNode <> B 
RETURN aNode 

此外,你應該真的在你的節點上使用標籤。最終匹配將匹配圖形中的所有節點,否則將不得不濾除。

編輯

關於你的#3的要求,規模()函數將是非常有益的在這裏,你可以得到一個模式匹配的大小,它會告訴你該模式的出現的次數。

該查詢的方法是首先獲取由A或B定義的節點的集合,然後過濾到從A定義關係的數量不等於以下數量的節點:從B定義關係。

雖然我們想使用類似UNION WITH的東西來獲得由A定義的節點的聯合並將其與由B定義的節點聯合,但是Neo4j的UNION支持現在很弱,因爲它不允許你在UNION發生之後做任何額外的操作,所以我們不得不求助於將兩組節點添加到相同的集合中,然後將它們退回到行中。

START A=node(885), B=node(996) 
MATCH (A)-[:define]->(x) 
WITH A, B, COLLECT(x) as middleNodes 
MATCH (B)-[:define]->(x) 
WITH A, B, middleNodes + COLLECT(x) as allMiddles 
UNWIND allMiddles as middle 
WITH DISTINCT A, B, middle 
WHERE SIZE((A)-[:define]->(middle)) <> SIZE((B)-[:define]->(middle)) 
RETURN middle 
+0

非常感謝您的回答。看着這個,我意識到了我沒有處理的測試用例,因此用查詢#3更新了我的問題。感謝您對此的意見。 – kami

+0

已更新,提供#3查詢和解決方法。 – InverseFalcon

+0

'WITH A,B,middleNodes + COLLECT(x)'行中的'middleNodes + COLLECT(x)'不應該用'AS'重命名嗎? – kami