4

我有一个国际象棋锦标赛的简单模型。它有5名玩家互相比赛。该图如下所示:

在此处输入图像描述

该图总体上没问题,但进一步检查后,您可以看到
Guy1 与 Guy2

Guy4 与 Guy5的两个集合
都有冗余关系。

问题显然出在数据中,其中每个匹配项都有一个无关的补充行(因此从某种意义上说,这是底层 csv 中的数据质量问题):

在此处输入图像描述

我可以手动清理这些行,但真正的数据集有数百万行。所以我想知道如何使用 CQL 以两种方式中的任何一种删除这些关系:

1)首先不要阅读额外的关系

2)继续创建额外的关系,但稍后将其删除。

提前感谢您对此的任何建议。

我正在使用的代码是这样的:

/ Here, we load and create nodes

LOAD CSV WITH HEADERS FROM
'file:///.../chess_nodes.csv' AS line
WITH line
MERGE (p:Player {
  player_id: line.player_id
})

ON CREATE SET p.name = line.name
ON MATCH SET p.name = line.name

ON CREATE SET p.residence = line.residence
ON MATCH SET p.residence = line.residence

// Here create the edges

LOAD CSV WITH HEADERS FROM
'file:///.../chess_edges.csv' AS line
WITH line
MATCH (p1:Player {player_id: line.player1_id})
WITH p1, line
OPTIONAL MATCH (p2:Player {player_id: line.player2_id})
WITH p1, p2, line
MERGE (p1)-[:VERSUS]->(p2)
4

4 回答 4

7

很明显,您不需要这种额外的关系,因为它不会为图表添加任何价值或权重。

尽管在文档中,但很少有人知道一些事情。

MERGE可用于undirected关系,neo4j 将为您选择一个方向(因为关系必须在图中定向)。

文档参考: http: //neo4j.com/docs/stable/query-merge.html#merge-merge-on-an-undirected-relationship

带有以下语句的示例,如果您是第一次运行它:

MATCH (a:User {name:'A'}), (b:User {name:'B'}) 
MERGE (a)-[:VERSUS]-(b)

它将创建关系,因为它不存在。但是,如果您再次运行它,则不会更改或创建任何内容。

我想它会解决您的问题,因为您不必担心预先清理数据,也不必担心之后运行脚本来清理您的图表。

于 2016-05-14T21:41:11.450 回答
2

我建议像这样创建一个“匹配”节点

(x:Player)-[:MATCH]->(m:Match)<-[:MATCH]-(y:Player) 

以启用与玩家分开的有关比赛的跟踪详细信息。

如果您需要跟踪与比赛本身不同的球员比赛,那么

(x:Player)-[:HAS_PLAYED]->(pair:HasPlayed)<-[:HAS_PLAYED]-(y:Player)

会成功的。

于 2016-05-14T21:45:12.063 回答
2

如果模式必须保持原样并且唯一的要求是删除冗余关系,那么

MATCH (p1:Player)-[r1:VERSUS]->(p2:Player)-[r2:VERSUS]->(p1)
DELETE r2

应该做的伎俩。这将找到所有具有双向 VERSUS 关系的 p1、p2 节点并删除其中一个。

于 2016-05-15T18:20:06.333 回答
0

您需要使用 UNWIND 来解决问题。

MATCH (p1:Player)-[r:VERSUS]-(p2:Player)
WITH p1,p2,collect(r) AS rels
UNWIND tail(rels) as rel
DELETE rel;

前面的代码将使用 match 找到 p1 和 p2 之间的 VERSUS 类型的直接连接(请注意,这不是定向的)。然后将获得关系的集合,最后是这些关系中的最后一个,它被删除。当然也可以加个检查看看集合的长度是否为2。

于 2019-08-19T21:07:05.677 回答