我有以下两种节点类型:
c:City {name: 'blah'}
s:Course {title: 'whatever', city: 'New York'}
想要创造这个:
(s)-[:offered_in]->(c)
我正在尝试将所有与城市无关的课程与城市建立关系(如果不存在则会创建城市)。然而,问题是我的数据集大约有500万个节点,并且我超时的任何查询都超时(除非我增加10k)。
......有人有什么建议吗?
修改
这是我现在正在运行的作业的查询(必须以10k块(数百万)完成,因为它需要几分钟。如果不存在则创建城市):
match (j:Job)
where not has(j.merged) and has(j.city)
WITH j
LIMIT 10000
MERGE (c:City {name: j.city})
WITH j, c
MERGE (j)-[:in]->(c)
SET j.merged = 1
return count(j)
(现在还不知道过滤掉已经匹配过的好方法,所以尝试通过使用我已经有索引的自定义“合并”属性标记它来实现它)
答案 0 :(得分:3)
500000是一个相当少的节点,在你的另一个问题上,你建议90%没有你想在这里建立的关系,所以这需要一些时间。如果没有更多的系统知识(规范,新设置,编程环境)以及运行时(旧数据或插入),这只是对更整洁解决方案的最佳猜测:
MATCH (j:Job)
WHERE NOT (j)-[:IN]->() AND HAS(j.city)
MERGE (c:City {name: j.city})
MERGE (j)-[:IN]->(c)
return count(j)
显然,您可以根据需要添加限制。