2016-08-12 180 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

感谢您的更新。会检查 ... –

相关问题