Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用neo4j在Cypher中建模运动比赛_Neo4j_Cypher - Fatal编程技术网

使用neo4j在Cypher中建模运动比赛

使用neo4j在Cypher中建模运动比赛,neo4j,cypher,Neo4j,Cypher,我创建了一个简单的csv,其中包含一些拳击比赛。我想弄清楚如何在Neo4j中建模 csv如下所示: 我对在Neo4j中使用这个小数据集感兴趣是因为它似乎是一个很好的方法,可以轻松地查询谁与谁作战,谁有共同的对手,或者其他什么 我的第一个想法是,自然地,每个拳击手都应该在一个“拳击手”节点中表示,而每一场战斗都应该在一个“战斗”节点中表示 在这样建模之后,我意识到,实际上每个拳击手没有一个节点,因为随着时间的推移,拳击手的年龄会发生变化。所以我意识到每个拳击手在每次比赛中都必须有一个单独的节点。

我创建了一个简单的csv,其中包含一些拳击比赛。我想弄清楚如何在Neo4j中建模

csv如下所示:

我对在Neo4j中使用这个小数据集感兴趣是因为它似乎是一个很好的方法,可以轻松地查询谁与谁作战,谁有共同的对手,或者其他什么

我的第一个想法是,自然地,每个拳击手都应该在一个“拳击手”节点中表示,而每一场战斗都应该在一个“战斗”节点中表示

在这样建模之后,我意识到,实际上每个拳击手没有一个节点,因为随着时间的推移,拳击手的年龄会发生变化。所以我意识到每个拳击手在每次比赛中都必须有一个单独的节点。例如,Glass Joe有两次斗殴,因此他出现了两次,一次是在他23岁的时候,另一次是在他与桑德曼的比赛中,他24岁:

但这有点违背了目的。现在,我的图表将由3个节点的断开连接的集合组成,csv中的每一个节点对应一个。那么目的是什么

我的问题是,我如何对这样一个简单但复杂的情况建模:某种类型的比赛或游戏会随着时间的推移而变化,竞争对手节点的属性也会发生变化——但我们希望图形是连接的:

(哦,桑德曼现在应该51岁了)

但是,同样,我认为上面的图像不正确——显示的边缘实际上是
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(*)