[英]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.