使用neo4j在Cypher中建模运动比赛
我创建了一个简单的csv,其中包含一些拳击比赛。我想弄清楚如何在Neo4j中建模 csv如下所示: 我对在Neo4j中使用这个小数据集感兴趣是因为它似乎是一个很好的方法,可以轻松地查询谁与谁作战,谁有共同的对手,或者其他什么 我的第一个想法是,自然地,每个拳击手都应该在一个“拳击手”节点中表示,而每一场战斗都应该在一个“战斗”节点中表示 在这样建模之后,我意识到,实际上每个拳击手没有一个节点,因为随着时间的推移,拳击手的年龄会发生变化。所以我意识到每个拳击手在每次比赛中都必须有一个单独的节点。例如,Glass Joe有两次斗殴,因此他出现了两次,一次是在他23岁的时候,另一次是在他与桑德曼的比赛中,他24岁: 但这有点违背了目的。现在,我的图表将由3个节点的断开连接的集合组成,csv中的每一个节点对应一个。那么目的是什么 我的问题是,我如何对这样一个简单但复杂的情况建模:某种类型的比赛或游戏会随着时间的推移而变化,竞争对手节点的属性也会发生变化——但我们希望图形是连接的: (哦,桑德曼现在应该51岁了) 但是,同样,我认为上面的图像不正确——显示的边缘实际上是使用neo4j在Cypher中建模运动比赛,neo4j,cypher,Neo4j,Cypher,我创建了一个简单的csv,其中包含一些拳击比赛。我想弄清楚如何在Neo4j中建模 csv如下所示: 我对在Neo4j中使用这个小数据集感兴趣是因为它似乎是一个很好的方法,可以轻松地查询谁与谁作战,谁有共同的对手,或者其他什么 我的第一个想法是,自然地,每个拳击手都应该在一个“拳击手”节点中表示,而每一场战斗都应该在一个“战斗”节点中表示 在这样建模之后,我意识到,实际上每个拳击手没有一个节点,因为随着时间的推移,拳击手的年龄会发生变化。所以我意识到每个拳击手在每次比赛中都必须有一个单独的节点。
boxer
节点的属性。如果它们是拳击手的财产…那么它们就不属于边缘,对吗
以下是我迄今为止的代码(以及csv):
从中加载带有标题的CSV
'文件://'作为行
创建(b:boxer{boxer\u id:line.boxer\u id,name:line.name})
设置b.age=TOINT(年龄);
从中加载带有标题的CSV
'文件://'作为行
合并(f:fight{fight\u id:line.fight\u id});
我最终得到了以下节点:
…但不知道如何连接它们。任何建议都将不胜感激。你的第一直觉是正确的。理想情况下,如果你有拳击手的生日,那就是你要储存的东西。这也将有助于区分同名/昵称的拳击手。不过,你把拳击手的年龄作为恋爱关系的一部分是个好主意 如果确实要为每行的每个boxer存储每个节点,可以执行以下操作:
(:BoxerRecord)-[:FOUGHT_IN]->(:Fight)
(:BoxerRecord)-[:REPRESENTS]->(:Boxer)
因此,基本上可以使用CREATE
子句为每个Boxer
记录创建每个Boxer记录
和MERGE
,以便将它们合并在一起
然后,如果你想找到两个人共同战斗过的所有拳击手(我正在编一个:
MATCH
(b1:Boxer {boxer_id: 100),
(b2:Boxer {boxer_id: 101})
(b1)<-[:REPRESENTS]-(:BoxerRecord)-[:FOUGHT_IN]->(:Fight)<-[:FOUGHT_IN]-(:BoxerRecord)-[:REPRESENTS]->(common_boxer:Boxer)<-[:REPRESENTS]-(:BoxerRecord)-[:FOUGHT_IN]->(:Fight)<-[:FOUGHT_IN]-(:BoxerRecord)-[:REPRESENTS]->(b2)
RETURN common_boxer, count(*)
匹配
(b1:Boxer{Boxer_id:100),
(b2:Boxer{Boxer_id:101})
(b1)(搏斗)(普通拳击手)(b2)
返回普通拳击手,计数(*)
MATCH
(b1:Boxer {boxer_id: 100),
(b2:Boxer {boxer_id: 101})
(b1)<-[:REPRESENTS]-(:BoxerRecord)-[:FOUGHT_IN]->(:Fight)<-[:FOUGHT_IN]-(:BoxerRecord)-[:REPRESENTS]->(common_boxer:Boxer)<-[:REPRESENTS]-(:BoxerRecord)-[:FOUGHT_IN]->(:Fight)<-[:FOUGHT_IN]-(:BoxerRecord)-[:REPRESENTS]->(b2)
RETURN common_boxer, count(*)