【问题标题】:Modeling a sports tournament in Cypher using neo4j使用 Neo4j 在 Cypher 中为体育赛事建模
【发布时间】:2016-06-19 17:28:01
【问题描述】:

我创建了一个包含一些拳击比赛的简单 csv。我试图弄清楚如何在 Neo4j 中对此进行建模。

csv 看起来像这样:

我之所以在 Neo4j 中练习使用这个小数据集的兴趣是因为 Neo4j 似乎是一种很好的方法,可以轻松查询谁与谁战斗,谁有共同的对手,等等。

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

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

但这有点违背了目的。现在,我的图表将由 3 个节点的不连贯集合组成,每个节点对应 csv 中的每个战斗。那么目的是什么?

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

(哎呀:睡魔现在应该是 51 岁了)

但话又说回来,我不认为上面的图像是正确的——显示的边缘实际上是boxer 节点的属性。如果它们是拳击手的属性……那么它们不属于边缘,对吧?

这是我目前的代码(以及 csv lives here):

LOAD CSV WITH HEADERS FROM
'file:///<grab it from dropbox please!>' AS line
CREATE (b:boxer  {boxer_id: line.boxer_id, name: line.name})
SET b.age = TOINT(age);


LOAD CSV WITH HEADERS FROM
'file:///<grab it from dropbox please!>' AS line
MERGE(f:fight  {fight_id: line.fight_id});

我最终得到了这些节点:

...但不确定如何连接它们。任何意见或建议将不胜感激。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    你的第一直觉是对的。理想情况下,如果您有拳击手的生日,那就是您要存储的东西。这也将帮助您区分具有相同姓名/昵称的拳击手。不过,您将拳击手的年龄存储为关系的一部分的想法是个好主意。

    如果您真的想为每一行的每个拳击手存储每个节点,您可以执行以下操作:

    (:BoxerRecord)-[:FOUGHT_IN]->(:Fight)
    (:BoxerRecord)-[:REPRESENTS]->(:Boxer)
    

    所以基本上你使用CREATE 子句为每个Boxer 记录创建每个BoxerRecordMERGE,以便它们合并在一起。

    那么如果你想找到两个人共同战斗过的所有拳击手(我正在编一个:

    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(*)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多