我们有一个由数据集(~500)和用户(~15)组成的图表。当我尝试使用以下查询清除两组节点时,Neo4J(v2.3.1)的内存使用量上升到1.5 GB以上,查询速度非常慢。
MATCH (ds:DataSet), (u:User)
OPTIONAL MATCH (ds)-[r1]-(), (u)-[r2]-()
DELETE ds, u, r1, r2
令人惊讶的是将查询拆分为以下两个查询:
MATCH (ds:DataSet) OPTIONAL MATCH (ds)-[r]-() DELETE ds, r
MATCH (u:User) OPTIONAL MATCH (u)-[r]-() DELETE u, r
将内存保持在~240 MB。启动后的初始内存消耗约为230 MB。
我的问题是第一个cypher查询是否存在概念性问题。是否假设同时删除多组节点效率非常低?
TL / DR
两个节点集(用户和数据集)不重叠但是链接在一起,即用户节点通过关系与数据集节点连接。
答案 0 :(得分:1)
如果你对这两个查询进行了分析,你会发现第一个产生了DataSet和User的笛卡尔积,因为它们在这一点上是断开连接的模式(即使它们可能在底层图中相关,模式不表达这个。)
效果更好的查询不会这样做 - 他们通过标签扫描和删除来查找节点。
答案 1 :(得分:1)
原来问题是(ds)-[r1]-()
和(u)-[r2]-()
的笛卡尔积。