neo4j - 从关系中删除冗余节点
问题描述
这是数据样本
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)
但不幸的是,它在所有记录之间产生了笛卡尔积,这使得关系非常大。
所以,我只想要它们各自的继任者的独特活动(独特活动)。
解决方案
您应该能够在导入时创建关系。
第一个技巧是删除标题名称中无关的空格以便于导入,即:
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
数据现在应该如您所愿。
推荐阅读
- dns - 托管中的 Webmail,将网站重定向到另一个 IP (VPS)
- maxima - 极大值求解方程
- android - 如何在图库中显示保存到手机中的图像?
- sql - 编写查询以显示最近 3 次低薪?
- xamarin - 将 Xamarin.android 应用程序移植到 xamarin.ios
- python - jupyter notebook 上没有名为 object_detection 的模块
- javascript - 循环需要帮助
- php - 一次付款减少两个票据总数
- python-3.x - 如何恢复蜘蛛,有能力在它停止的地方重新启动。使用网络抓取和 python
- android - 在 API 级别 28 中不推荐使用 activeNetworkInfo.type