Neo4j 在Cypher中使用读取CSV时创建关系
我创建了一个非常简单的CSV,因此我可以练习将CSV加载到Neo4j中 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
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]
。)