2016-08-12 184 views
0

如果我通過執行此查詢有一個圖,那麼我想刪除一箇中間節點說'和',並連接它的前一個節點說'圖「其子節點說'基於相同的通過使用其對應的出關系‘SEQID分貝’neo4j cypher查詢刪除一箇中間節點,並將其所有父節點連接到子節點

MERGE (n:Person { name: 'graph'}) 

MERGE (n:Person { name: 'and'}) 

MERGE (n:Person { name: 'relational' }) 

MERGE (n:Person { name: 'nosql'}) 

MERGE (n:Person { name: 'server'}) 

MERGE (n:Person { name: 'db'}) 

MERGE (a:Person { name: 'graph'}) MERGE (b:Person { name: 'and' }) MERGE (a)-[:NEXT{seqid:1}]->(b) 

MERGE (a:Person { name: 'and' }) MERGE (b:Person { name: 'db'}) MERGE (a)-[:NEXT{seqid:1 , caps: 'true'}]->(b) 

MERGE (a:Person { name: 'relational'}) MERGE (b:Person { name: 'db'}) MERGE (a)-[:NEXT{seqid:1}]->(b) 

MERGE (a:Person { name: 'nosql'}) MERGE (b:Person { name: 'db' }) MERGE (a)-[:NEXT{seqid:2, caps: 'true'}]->(b) 

MERGE (a:Person { name: 'server'}) MERGE (b:Person { name: 'and' }) MERGE (a)-[:NEXT{seqid:1}]->(b) 

MERGE (a:Person { name: 'and' }) MERGE (b:Person { name: 'db'}) MERGE (a)-[:NEXT{seqid:1}]->(b) 

MERGE (a:Person { name: 'server'}) MERGE (b:Person { name: 'and'}) MERGE (a)-[:CONNECTS{seqid:2}]->(b) 

MERGE (a:Person { name: 'and' }) MERGE (b:Person { name: 'db'}) MERGE (a)-[:CONNECTS{seqid:2, caps: 'true'}]->(b) 

(graph)-[:NEXT{seqid:1 , caps: 'true'}]->(db) 

(relational)-[:NEXT{seqid:1}]->(db) 

(nosql)-[:NEXT{seqid:2, caps: 'true'}]->(db) 

(server)-[:NEXT{seqid:1}]->(db) 

(server)-[:CONNECTS{seqid:2, caps: 'true'}]->(db) 

請幫助我解決這個........ .....

(我是使用的Neo4j 2.3.6通過在嵌入式模式的Java API社區版。)

回答

0

這裏的障礙是關係類型不能動態地創建。您不能檢查傳入的關係,不知道它們的類型,並創建同一類型的新關係。

如果你知道你的類型需要處理的關係,並能明確解決這些,那麼你可以用暗號做到這一點。下面是查詢所有這樣做:NEXT關係,複製在從中間節點到終端節點的關係轉移到新創建的關係的性質:

MATCH (middle:Person{name:'and'}) 
WITH middle 
MATCH (from:Person)-[rFrom:NEXT]->(middle) 
WHERE exists(rFrom.seqid) 
WITH middle, rFrom, from 
MATCH (middle)-[rTo:NEXT]->(to:Person) 
WHERE rTo.seqid = rFrom.seqid 
WITH middle, rFrom, from, rTo, to 
CREATE (from)-[rNew:NEXT]->(to) 
SET rNew += rTo 
DELETE rFrom 

你要重複這對於每您感興趣的關係類型,以及何時與您的中間節點沒有更多關係,請刪除該節點。

請注意,如果你升級到的Neo4j 3,APOC程序庫中有圖重構過程,這將很容易地照顧這。

編輯

改變了我的Cypher支架上面做的創造,而不是合併。

還刪除了從中間節點到下一個節點的關係刪除,因爲您似乎希望從連接中間節點到下一個節點的關係中獲取關係屬性,並且由於可能存在多個到達關係的傳入關係中間節點具有相同的類型和id,但只有來自具有該類型和id的中間節點的單個關係。

這意味着你用相同類型和ID傳入關係的比例不等於相同類型和ID的引出的關係,因此我們將創造新的關係時,可以重用那些外向的關係。

只有在全部完成創建新關係後,才能分離並刪除中間節點。

+0

謝謝您的回覆........ –

+0

請幫忙.........這個查詢只捕獲兩個新連接的節點之間的最後一個關係,如果存在多個具有不同屬性的相同類型的關係時。我想捕捉所有的關係... –

+0

當創建新的NEXT關係時,我錯誤地使用了MERGE而不是CREATE。嘗試新的查詢。 – InverseFalcon

0

添加滿足所有要求的其他答案,但需要Neo4j 3.0.x或更高版本。具體而言,這要求APOC程序中的apoc.create.relationship()程序,它允許我們與動態類型建立關係,該關係由匹配關係提供。

這會照顧所有關係的一次(至少那些具有SEQID),所以我們應該還好分離,並在年底刪除中間節點。

MATCH (middle:Person{name:'and'}) 
WITH middle 
MATCH (from:Person)-[rFrom]->(middle) 
WHERE EXISTS(rFrom.seqid) 
WITH middle, rFrom, from 
MATCH (middle)-[rTo]->(to:Person) 
WHERE TYPE(rTo) = TYPE(rFrom) AND rTo.seqid = rFrom.seqid 
WITH middle, rFrom, from, rTo, to 
CALL apoc.create.relationship(from, TYPE(rFrom), PROPERTIES(rTo), to) YIELD rel 
DETACH DELETE middle 
+0

感謝您的更新。會檢查 ... –

相關問題