首页 > 解决方案 > 从关系中删除冗余节点

问题描述

这是数据样本

CaseID,name,child,parent
1,register request,examine thoroughly, null
1,examine thoroughly,register request,check ticket
1,check ticket,examine thoroughly,decide
1,decide,check ticket,reject request
1,reject request,decide, null
6,register request,null,examine casually
6,examine casually,register request,check ticket
6,check ticket,examine casually,decide
6,decide,check ticket,pay compensation
6,pay compensation,Mike,200,decide, null

基本上,我想按 [name] 分组并使用 Cypher 与他们的 [children] 进行所有活动。

在父级或子级中具有 null 意味着它没有这样的链接。

以下查询创建了一个 caretsian 产品,它使它变得非常大,而我想区分活动并获得它们各自的继任者。

MATCH (p:Activity),(c:Activity)
WHERE p.child=c.name AND c.child <> p.name
CREATE (p)-[r:PRODUCES]->(c)
RETURN collect(r)

但不幸的是,它在所有记录之间产生了笛卡尔积,这使得关系非常大。

所以,我只想要它们各自的继任者的独特活动(独特活动)。

标签: neo4jcypher

解决方案


您应该能够在导入时创建关系。

第一个技巧是删除标题名称中无关的空格以便于导入,即:

CaseID, name, child, parent

应该变成:

CaseID,name,child,parent

为了确保后续MERGE语句可以快速运行:

CREATE INDEX FOR (a:Activity) ON (a.name)

然后导入可以变成(根据您的需要调整dbms.directories.import和设置):dbms.security.allow_csv_import_from_file_urls

LOAD CSV WITH HEADERS FROM "file:///path/to/import.csv" AS row
MERGE (child:Activity {name: trim(row.child)})
MERGE (parent:Activity {name: trim(row.parent)})
MERGE (parent)-[:PRODUCES]->(child)

但是,导入的写入方式会将null条目作为 string处理"null"。为简单起见,您可以在最后运行一个额外的查询,以删除该节点及其关系:

MATCH (a:Activity {name: "null"}) DETACH DELETE a

数据现在应该如您所愿。


推荐阅读