与链接表建立关系

时间:2016-11-28 23:09:21

标签: neo4j

我对Neo4j很新:

我正在移动MySQL数据来可视化和分析数据,但我无法建立关系。

到目前为止,我的构建脚本如下所示:

// Create Players
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:player.csv" AS row
CREATE (:Player {   playerID: row.id, name: row.Name });
CREATE INDEX ON :Player(name);
CREATE INDEX ON :Player(playerID);

// Create Team
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:team.csv" AS row
CREATE (:Team {   teamID: row.id });
CREATE INDEX ON :Team(teamID);

// Create PlayerLinks
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:playerlinks.csv" AS row
CREATE (:Links {   linkID: row.id, fromPlayerID: row.fromPlayerID, toPlayerId: row.toPlayerId, teamID: row.teamID, years: row.years });


MATCH   (p:Player),(t:Team), (l:Links)
WHERE   l.fromPlayerID = p.playerID
AND     l.toPlayerId = p.playerID
AND     l.teamID = t.teamID
CREATE  

playerlinks包含我想要创建的关系

这是我想要实现的目标图: Players

1 个答案:

答案 0 :(得分:1)

实际上,看起来你几乎就在那里。

正如我在对问题本身的评论中所提到的,您将要从脚本中删除索引创建(在导入之前应该只应用一次,并且您应该考虑对ID字段使用唯一约束)。 / p>

至于你的:链接节点,你打算只使用它们来创建关系,还是计划在之后保留它们?

保持方法:将链接节点与图表中其他元素的关系作为中间节点链接,可能如下所示:

MATCH   (l:Links)
WITH l
MATCH   (p1:Player), (p2:Player), (t:Team)
WHERE   l.fromPlayerID = p1.playerID
AND     l.toPlayerId = p2.playerID
AND     l.teamID = t.teamID
MERGE  (l)-[:Teammate]->(p1)
MERGE  (l)-[:Teammate]->(p2)
MERGE  (l)-[:PlayedOn]->(t)

将你的:Links节点连接到队友的玩家,连接到:他们玩的团队,以及你的:Links节点保持他们一起玩的年份。此时,您可以从节点中删除linkID,toPlayerID,fromPlayerID和teamID属性,因为在图形数据库中,当从关系数据库转换时,数据库关系往往会替换外键,因为您可能无法查找:链接节点按ID。

或者(根据您所需的图表),您可以使用:Links节点上的信息来创建:玩家之间的关系。您可以在关系中设置一起玩的年数和他们所在团队的ID(或名称)的属性。请记住,关系本身无法指向:玩家一起玩的团队节点,尽管您应该能够使用该信息创建:PlayedOn关系:玩家到:相关团队。< / p>

这种建模可能如下所示:

MATCH   (l:Links)
WITH l
MATCH   (p1:Player), (p2:Player), (t:Team)
WHERE   l.fromPlayerID = p1.playerID
AND     l.toPlayerId = p2.playerID
AND     l.teamID = t.teamID
MERGE  (p1)-[:Teammate{years: l.years, team: t.teamID}]->(p2)
MERGE  (p1)-[:PlayedOn]->(t)
MERGE  (p2)-[:PlayedOn]->(t)

请记住:队友之间的关系可能很慢。如果您只计划运行一次,则可以使用CREATE而不是MERGE。