Neo4j使用FROM CSV来同时创建节点和关系

时间:2019-08-01 18:37:35

标签: neo4j cypher

Neo4j的新手。我知道这个问题的标题类似(Creating nodes and relationships at the same time in neo4j),但我相信我正在尝试做一些不同的事情。另外,如果可能的话,我也想避免使用插件。

基本上我有一个看起来像这样的1000行CSV

FromNodeID  ToNodeID   type    attribute1   attribute2   
   1          2       1        1234      1235
   3          2       1        1234      1235
  ...

所以我想创建节点及其关系。 FromNode和ToNode分别只有一个属性(ID),关系具有3个属性(类型,属性1和属性2)。我希望每个节点都是唯一的,但是每个节点可以具有许多关系(在上面的示例中,节点2应该具有2个关系)。

这就是我要完成的工作:

load csv with headers from "file:///file.csv" as row
MERGE (FromNode {id:toInteger(row.FromNode)})-[:communicates 
{Type:toInteger(row.Type), attribute1:toInteger(row.attribute1), 
attribute2:toInteger(row.attribute2)}]->(ToNode 
{id:toInteger(row.ToNode)})

在此查询之前,我确实对FromNode和ToNode ID设置了唯一性约束。

我希望它创建每个节点(并且当已经存在具有相同ID的节点时,不创建新节点)并创建每个关系(从/到被指定为在节点中具有多个关系的节点具有多个关系)。 CSV)。

实际发生的情况:似乎已经创建了所有唯一节点。它还在节点之间创建关系,但每个节点仅放置一个关系,而不考虑与多个节点进行通信的某些节点。

我很困惑,因为据我了解,如果没有在数据库中出现,则使用MERGE会创建一个关系,所以我认为它将创建CSV中指定的所有关系

1 个答案:

答案 0 :(得分:1)

您所写的MERGE子句未为任何一个节点指定标签。由于唯一性约束与节点标签和节点属性都相关联,因此,如果您在节点创建过程中未指定节点标签,那么neo4j将无法实施任何唯一性约束。因此MERGE实际上正在创建一些重复的节点(没有标签)。这就是为什么所有新节点都只有一个关系的原因。

在Cypher中,节点的标签必须以冒号开头。例如,用(:Foo {abc:123})代替(Foo {abc:123})

此外,为避免潜在的违反约束的错误,每个节点应该有单独的MERGE子句。

如果相关标签为FromNodeToNode,请尝试以下操作:

LOAD CSV WITH HEADERS FROM "file:///file.csv" AS row
MERGE (f:FromNode {id:toInteger(row.FromNode)})
MERGE (t:ToNode {id:toInteger(row.ToNode)})
MERGE (f)-[:communicates {
    Type:toInteger(row.Type), attribute1:toInteger(row.attribute1),
    attribute2:toInteger(row.attribute2)}
  ]->(t)