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中指定的所有关系
答案 0 :(得分:1)
您所写的MERGE
子句未为任何一个节点指定标签。由于唯一性约束与节点标签和节点属性都相关联,因此,如果您在节点创建过程中未指定节点标签,那么neo4j将无法实施任何唯一性约束。因此MERGE
实际上正在创建一些重复的节点(没有标签)。这就是为什么所有新节点都只有一个关系的原因。
在Cypher中,节点的标签必须以冒号开头。例如,用(:Foo {abc:123})
代替(Foo {abc:123})
。
此外,为避免潜在的违反约束的错误,每个节点应该有单独的MERGE
子句。
如果相关标签为FromNode
和ToNode
,请尝试以下操作:
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)