Mon*_*eck 4 tournament neo4j cypher
我有一个简单的国际象棋比赛模型.它有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)
Run Code Online (Sandbox Code Playgroud)
很明显,您不需要这种额外的关系,因为它不会向图形添加任何值或权重.
尽管存在于文档中,但很少有人知道这一点.
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)
Run Code Online (Sandbox Code Playgroud)
它将创建不存在的关系.但是,如果再次运行它,则不会更改或创建任何内容.
我想它可以解决您的问题,因为您不必担心提前清理数据,也不必为了清理图表而运行脚本.
| 归档时间: |
|
| 查看次数: |
576 次 |
| 最近记录: |