在neo4j中创建多个节点之间的多个关系

时间:2018-03-24 08:21:06

标签: csv graph 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 个答案:

答案 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