我对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
包含我想要创建的关系
答案 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。