Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j使用FROM CSV同时创建节点和关系_Neo4j_Cypher - Fatal编程技术网

Neo4j使用FROM 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 ... 所以我想

Neo4j的新功能。我意识到这个问题有一个类似的标题(),但我相信我正在尝试做一些不同的事情。如果可能的话,我也希望避免使用插件

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

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”在本文中到底指的是什么?它只是我可以在查询的其他地方引用的变量吗?