![](/img/trans.png)
[英]Neo4j cypher query for deleting all children nodes and its relationships except one child node
[英]neo4j cypher query to delete a middle node and connect all its parent node to child node
如果我通過執行此查詢得到一個圖,則我想刪除一個中間節點說“和”,並通過基於相同的“ seqid”使用其對應的傳出關系,將其上一個節點說“ graph”連接到其子節點說“ db” '
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)
請幫助我解決這個問題。
(我正在通過嵌入式模式下的java api使用neo4j 2.3.6社區版。)
這里的障礙是關系類型不能動態創建。 您無法檢查傳入的關系,不知道它們的類型,也不能創建相同類型的新關系。
如果您知道需要處理的關系類型並且可以明確解決這些關系,則可以使用Cypher來完成。 這是對所有: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的傳出關系的比率,因此我們在創建新關系時將重用這些傳出關系。
只有在完成創建新關系之后,才應該分離並刪除中間節點。
添加另一個滿足所有要求但需要Neo4j 3.0.x或更高版本的答案。 具體來說,這需要APOC Procedures中的apoc.create.relationship()過程,該過程將使我們創建一個具有動態類型的關系,該關系是從matched from關系提供的。
這將立即處理所有關系(至少具有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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.