Neo4j 在Cypher中使用读取CSV时创建关系

Neo4j 在Cypher中使用读取CSV时创建关系,neo4j,cypher,Neo4j,Cypher,我创建了一个非常简单的CSV,因此我可以练习将CSV加载到Neo4j中 CSV如下所示: boxer_id name boxer_country total_wins bdate fought fight_id fight_location outcome 1 Glass Joe France 0 1/2/80 2 100 Las Vegas L 2 B

我创建了一个非常简单的CSV,因此我可以练习将CSV加载到Neo4j中

CSV如下所示:

boxer_id    name      boxer_country total_wins  bdate   fought  fight_id    fight_location  outcome
1         Glass Joe   France            0       1/2/80    2      100          Las Vegas      L
2        Bald Bull    Turkey            2       2/3/81    1      100          Macao          W
3       Soda Popinski Russia            6       3/4/82    4      101          Atlantic City  L
4          Sandman    USA               9       4/5/83    3      101         Japan           W  
我想做两个节点,
boxer
fight

但是我很难把拳击手和拳击比赛联系起来

就我所知:

如您所见,我成功地读入了节点,但我不知道如何创建拳击手与其拳击比赛之间的关系

我想做一些类似的事情:

CREATE (boxer)-[:AGAINST]->(boxer)  
但这毫无意义。我需要使用字段
,它封装了关于谁在拳击场上面对过谁的信息

如有任何建议,将不胜感激。我不知道如何在读取CSV的上下文中执行此操作

这是我的密码:

// The goal here is to create a node called Boxer, and pull in properties.

LOAD CSV WITH HEADERS FROM
'file:///test.csv' AS line
WITH line, SPLIT(line.bdate, '/') AS bdate
CREATE (b:boxer  {boxer_id: line.boxer_id})
SET b.byear= TOINT(bdate[2]),
    b.bmonth= TOINT(bdate[0]),
    b.bday = TOINT(bdate[1]),
    b.name = line.name,
    b.country = line.boxer_country,
    b.total_wins = TOINT(line.total_wins)


// Now we make a node called Fight
LOAD CSV WITH HEADERS FROM
'file:///test.csv' AS line
CREATE (f:fight  {fight_id: line.fight_id, fight_loc: line.fight_location})

// Now we set relationships
// ????

您可以添加几行来匹配您已经创建的拳击手,并在他们和新创建的拳击比赛之间创建关系。我在想这样的事情可能对你有用

LOAD CSV WITH HEADERS FROM
'file:///test.csv' AS line
MATCH (b1:boxer {boxer_id: line.boxer_id})
WITH line, b1
MATCH (b2:boxer {boxer_id: line.fought})
MERGE (f:fight  {fight_id: line.fight_id})
CREATE (b1)-[:AGAINST]->(b2)
CREATE (b1)-[:FOUGHT_IN]->(f)
CREATE (b2)-[:FOUGHT_IN]->(f)

一个选项是仅将战斗建模为Boxer节点之间的关系,而不是创建战斗节点:

LOAD CSV WITH HEADERS FROM 'file:///test.csv' AS line
MERGE (b1:Boxer {boxer_id: line.boxer_id})
MERGE (b2:Boxer {boxer_id: line.fought})
CREATE (b1)-[f:fought]->(b2)
SET f.location = line.fight_location,
    f.outcome = line.outcome
然而,将战斗建模为节点可能更有意义,因为它们是事件。如果是这样的话:

LOAD CSV WITH HEADERS FROM 'file:///text.csv' AS line
MATCH (b:Boxer {boxer_id: line.boxer_id})
MERGE (f:fight  {fight_id: line.fight_id})
ON CREATE SET f.location = line.fight_location
CREATE (b)-[r:FOUGHT_IN]->(f)
WITH r, CASE line.outcome WHEN "W" THEN [1] ELSE [] END AS win
FOREACH (x IN win | SET r.winner = TRUE)
这里请注意,我们将战斗结果存储为关系中的
:fighted\u上的属性


编辑更新为使用
合并
避免创建重复的战斗节点。使用
MERGE
时,还应创建唯一性约束:
create constraint ON(f:Fight)ASSERT f.Fight\u id是唯一的在运行导入脚本之前。

您能看一下吗?我想也许我必须添加一些唯一性约束?战斗节点出现多次。除此之外:你所做的似乎很有效!!啊,是的-没有意识到战斗id被复制了。更新。这里有一个有趣的问题——战斗ID实际上不是唯一的!!查看
fight_ID
列,值为100、100和101、101。当我设置约束时,我得到了一个错误。它们在你的数据模型中是唯一的,只是在CSV文件中不是唯一的(战斗中每个拳击手有一个条目)。是你的朋友在这里。呃……不知道为什么我一直得到
节点10已经存在,并且在创建搏击节点时(设置约束后)标签为搏击,属性为“搏击id”=[100]
。)