【发布时间】:2016-09-10 22:44:40
【问题描述】:
我有一个国际象棋锦标赛的简单模型。它有5名玩家互相比赛。图表如下所示:
图表总体上很好,但进一步检查后,您可以看到两组
Guy1 与 Guy2,
和
Guy4 vs 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)
【问题讨论】:
-
这与您的问题没有直接关系,但这些查询有很多无关的子句。 1.
ON CREATE blah/ON MATCH blah对可以只替换为单个blah。 2.WITH子句没有任何用途,可以删除。 -
对于#1,首选语法是什么?
-
由于要执行完全相同的
SET操作,因此无论MERGE是创建新节点还是匹配现有节点,都不应使用ON MATCH和ON createat全部。只需直接执行 2 个不同的SET操作:SET p.name = line.name, p.residence = line.residence。 -
啊啊啊……是的,这是有道理的。
ON CREATE / ON MATCH基本上只是意味着SET。谢谢!! -
但是等等。我使用
ON MATCH和ON CREATE作为解决方案,因为我的数据有一些缺失值,而MERGE的缺失值很糟糕。
标签: neo4j cypher tournament