2016-09-19 70 views
0

對不起,對於標題。我找不到更好的。我的問題很難用言語解釋,所以我會試着舉個例子。假設我有一個名爲「FOO」的關係,「FOO」有兩個名爲「id」和「bar」的屬性。Neo4j查詢 - 一個屬性與另一個屬性分組的任何關係中的值不相等的關係

而且有這樣一個圖:

(n1)-[:FOO {id: "1", bar:"8"}]->(n2)-[:FOO {id: "1", bar:"27"}]->(n3)-[:FOO {id: "1", bar:"50"}]->(n4) 

(m1)-[:FOO {id: "4", bar:"2"}]->(m2)-[:FOO {id: "4", bar:"12"}]->(n2)-[:FOO {id: "4", bar:"25"}]->(m3) 

(n1)-[:FOO {id: "7", bar:"11"}]->(m2)-[:FOO {id: "7", bar:"50"}]->(o3)-[:FOO {id: "7", bar:"14"}]->(o5) 

等等......

我想要做的就是讓對(有關這些ID或節點和關係)的所有ID關係系列沒有任何「欄中的」屬性等於50

在上述曲線圖中,結果我想是第二個,ID:「4」

(m1)-[:FOO {id: "4", bar:"2"}]->(m2)-[:FOO {id: "4", bar:"12"}]->(m3)-[:FOO {id: "4", bar:"25"}]->(m3) 

加上這個查詢如何獲得關係系列的最後關係欄屬性不等於50的所有id(或節點和與這些id相關的關係)。在這一個中,我想得到是第一和第三個,ID: 「4」ID: 「7」

(m1)-[:FOO {id: "4", bar:"2"}]->(m2)-[:FOO {id: "4", bar:"12"}]->(n2)-[:FOO {id: "4", bar:"25"}]->(m3) 

(n1)-[:FOO {id: "7", bar:"11"}]->(m2)-[:FOO {id: "7", bar:"50"}]->(o3)-[:FOO {id: "7", bar:"14"}]->(o5) 

回答

1
UNWIND [1, 4, 7] AS rel_id 
MATCH path =() - [:FOO*3 {id:rel_id}] ->() 
WHERE NOT ANY(x IN RELATIONSHIPS(path) WHERE x.bar = '50') 
RETURN path 

而對於2號:

UNWIND [1, 4, 7] AS rel_id 
MATCH path =() - [:FOO*3 {id: rel_id}] ->() 
WHERE NOT LAST(RELATIONSHIPS(path))['bar'] = '50' 
RETURN RELATIONSHIPS(path)[0]['id'] 

這基本上是解決您的問題的最小框架。如果您需要縮小可能的路徑,則可以使用別的前綴查詢來爲要構建路徑的節點或關係進行別名。

編輯:爲了獲得所有可能的ID,而不是通過手動名單,替換第一行:

MATCH() - [r:FOO] -() 
WITH r.id AS r_id 
WITH COLLECT(DISTINCT r_id) AS rel_ids 
UNWIND rel_ids AS rel_id 
+0

謝謝。 圖中有許多id。我無法像你寫的那樣手動給他們。有沒有另一種方式呢? 也可能有比3更多的關係。有沒有辦法獲得路徑,無論它包含多少關係? – nulladex

+0

查看上面的編輯以傳入不同的ID。至於'*'表示法,請查看[here](http://neo4j.com/docs/developer-manual/3.0/cypher/#_variable_length)。 –

+0

'MATCH() - [r:FOO] - () WITH r。id AS r_id WITH COLLECT(DISTINCT r_id)AS rel_ids UNWIND rel_ids AS rel_id MATCH path =() - [:FOO {id:rel_id}] - >() WHERE NOT ANY(x IN關係(路徑)WHERE x .bar = 50) 返回關係(路徑)[0] ['id']' 我試過這個查詢,但是「WHERE NOT ANY」部分沒有做任何事情。結果是相同的或不相同。 – nulladex

0

我不知道這是做了正確的方式,但我設法得到第一結果,我想是這樣的:

MATCH() - [r:FOO] -() 
WHERE r.bar = "50" 
WITH COLLECT(DISTINCT r.id) as bar50_ids 
MATCH() - [r:FOO] -() 
WITH COLLECT(DISTINCT r.id) as all_ids, bar50_ids 
RETURN [x IN all_ids WHERE NOT(x IN bar50_ids)] AS barnot50_ids 

(越來越清晰地標識的,其在其所有的關係的至少一個的.bar =「50」,並從所有DISTINC ID的得到他們的差異將會給所有的ID是沒有任何關係包含吧=「50」)

我不知道如何獲得我想要的