获取没有特定关系的节点(cypher / neo4j)

时间:2014-09-04 17:19:48

标签: neo4j cypher graph-databases

我有以下两种节点类型:

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)

(现在还不知道过滤掉已经匹配过的好方法,所以尝试通过使用我已经有索引的自定义“合并”属性标记它来实现它)

1 个答案:

答案 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)

显然,您可以根据需要添加限制。