[英]Create multiple relationship between multiple nodes in neo4j
我有一个带有标题的 CSV 文件,例如
Relationshiptype source target
Causative_of Absorb_heat Apply_heat
Inheritance Absorb_heat Transition
ReFraming_Mapping Transition Transitionstate
我必须在这个源和目标之间创建关系,这个源和目标之间的关系将是“relationshiptype”。
我试过:
LOAD CSV WITH HEADERS FROM "file:///output.csv" AS line
CREATE (sub:Source {name:line.source})
CREATE (sup:Target {name:line.target})
CREATE (sub)-[:Causative_of]->(sup)
CREATE (sub)-[: Inheritance]->(sup)
CREATE (sub)-[: ReFraming_Mapping]->(sup)
RETURN sub,sup;
但这不起作用。 它随机创建源和目标之间的关系。
我找不到任何方法来创建这种多重关系。 有没有办法做到这一点? 请帮忙。
有几个问题:
1)因为节点可以重复,所以你应该使用MERGE
而不是CREATE
来添加新节点:
MERGE (sub:Source {name:line.source})
2)由于一个节点既可以是源也可以是目标,所以使用不同的标签是不合适的。 使用一个,例如Item
:
MERGE (sub:Item {name:line.source})
3) 在查询中,您一次创建三种类型的关系,尽管您需要使用输入数据中的关系类型。 问题是目前您无法从neo4 cyper
的变量设置关系类型。 而且也没有条件分支。 因此,您可以在FOREACH
[ http://markhneedham.com/blog/2014/06/17/neo4j-load-csv-handling-conditionals/ ] 中使用以下技巧:
LOAD CSV WITH HEADERS FROM "file:///output.csv" AS line
MERGE (sub:Item {name:line.source})
MERGE (sup:Item {name:line.target})
FOREACH(ift in CASE WHEN line.Relationshiptype="Causative_of" THEN [1] ELSE [] END |
CREATE (sub)-[:Causative_of]->(sup)
)
FOREACH(ift in CASE WHEN line.Relationshiptype="Inheritance" THEN [1] ELSE [] END |
CREATE (sub)-[:Inheritance]->(sup)
)
FOREACH(ift in CASE WHEN line.Relationshiptype="ReFraming_Mapping" THEN [1] ELSE [] END |
CREATE (sub)-[:ReFraming_Mapping]->(sup)
)
RETURN sub, sup
4)这不是很好和高效,所以你可以使用APOC
库[ https://stackoverflow.com/a/40225888/4989460 ]中的create.relationship
函数:
LOAD CSV WITH HEADERS FROM "file:///output.csv" AS line
MERGE (sub:Item {name:line.source})
MERGE (sup:Item {name:line.target})
WITH sub, sup, line
CALL apoc.create.relationship(sub, line.Relationshiptype, NULL, sup) YIELD rel
RETURN sub, rel, sup
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.