Neo4j使用FROM CSV同时创建节点和关系
Neo4j的新功能。我意识到这个问题有一个类似的标题(),但我相信我正在尝试做一些不同的事情。如果可能的话,我也希望避免使用插件 基本上我有一个1000行的CSV,看起来像这样Neo4j使用FROM CSV同时创建节点和关系,neo4j,cypher,Neo4j,Cypher,Neo4j的新功能。我意识到这个问题有一个类似的标题(),但我相信我正在尝试做一些不同的事情。如果可能的话,我也希望避免使用插件 基本上我有一个1000行的CSV,看起来像这样 FromNodeID ToNodeID type attribute1 attribute2 1 2 1 1234 1235 3 2 1 1234 1235 ... 所以我想
FromNodeID ToNodeID type attribute1 attribute2
1 2 1 1234 1235
3 2 1 1234 1235
...
所以我想创建节点及其关系。FromNodes和ToNodes各自只有一个属性(ID),关系有3个属性(type、attribute1和attribute2)。我希望每个节点都是唯一的,但每个节点可以有许多关系(在上面的示例中,节点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,那么MERGE会创建一个关系,所以我认为它会创建CSV中指定的所有关系,正如所写的那样,您的
MERGE
子句没有为任何节点指定标签。由于唯一性约束与节点标签和节点特性都关联,因此如果在节点创建期间未指定节点标签,neo4j将无法强制执行任何唯一性约束。因此,合并
实际上是在创建一些重复节点(没有标签)。这也是为什么所有新节点都只有一个关系
在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)
啊,谢谢你,效果很好。所以,如果我不指定一个标签-ex.(ToNode{attr:123}),“ToNode”在本文中到底指的是什么?它只是我可以在查询的其他地方引用的变量吗?