我有一个包含
标题的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;
但这不起作用。它随机地创造了源与之间的关系;目标。
我找不到任何方法来创建这种多重关系。有没有办法做到这一点?请帮忙。
答案 0 :(得分:2)
有几个问题:
1)由于可以重复节点,因此您应该使用::before
而不是MERGE
来添加新节点:
CREATE
2)由于节点既可以是源节点也可以是目标节点,因此不适合使用不同的标签。使用一个,例如MERGE (sub:Source {name:line.source})
:
Item
3)在您的查询中,您可以一次创建三种类型的关系,尽管您需要使用输入数据中的关系类型。问题是,在MERGE (sub:Item {name:line.source})
中您无法设置变量的关系类型。而且也没有条件分支。因此,您可以在neo4 cyper
[http://markhneedham.com/blog/2014/06/17/neo4j-load-csv-handling-conditionals/]:
FOREACH
4)这不是非常好用和高效,因此您可以使用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
库[https://stackoverflow.com/a/40225888/4989460]中的create.relationship
函数:
APOC