2016-03-02 18 views
1

我创建了一个非常简单的CSV,因此我可以练习将CSV加载到Neo4j中。在Cypher中使用READ CSV时创建关系

的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 

我要打2个节点,boxerfight

但我无法将拳击手连接到战斗。

这里的,据我得到:

enter image description here

正如你所看到的,我成功读取的节点,但我不知道如何创建拳击手和他们的拳击比赛之间的关系。

我想要做的事,如:

CREATE (boxer)-[:AGAINST]->(boxer) 

但是这没有任何意义。我需要使用字段fought,该字段封装了谁在环中遇到谁的信息。

任何意见将不胜感激。我不确定如何在READ 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 
// ???? 

回答

1

你可以添加几行,以配合您已经创建的拳击手,并在它们与新创建的斗争之间的关系。我想沿着这些线路的东西可能会为你工作...

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) 
0

一种选择是只战斗建模为义和团节点之间的关系,而不是创造上打个结:

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) 

注意,我们保存战斗,因为在:FOUGHT_IN关系属性的结果。

编辑更新为使用MERGE以避免创建重复的Fight节点。在使用MERGE时,您还应该在运行导入脚本之前创建唯一性约束:CREATE CONSTRAINT ON (f:Fight) ASSERT f.fight_id IS UNIQUE;

+0

你能看一看吗?我想也许我必须添加某种唯一性约束?战斗节点出现多次。除此之外:你做的似乎很好! http://imgur.com/szprEfq –

+0

啊是的 - 没有意识到'fight_id's是重复的。更新。 –

+0

这里有一个有趣的问题 - 战斗ID实际上*不是*独特的!查看'fight_ID'列,值为100,100和101,101。设置约束时出现错误。 –