2014-09-04 119 views
6

我有以下两个节点类型:获取不具有一定的关系(CYPHER/Neo4j的)节点

c:City {name: 'blah'} 
s:Course {title: 'whatever', city: 'New York'} 

展望创建此:

(s)-[:offered_in]->(c) 

我试图让所有不与城市联系并创建与城市的关系的课程(如果不存在,则创建城市)。然而,问题是我的数据集大约有500万个节点,而且我的任何查询都超时(除非我的增量为10k)。

......有人有什么建议吗?

编辑:

这里是我现在正在运行的任务查询(即在10K块做(出数以百万计),因为它需要几分钟的时间,因为它是没有按是否创建城市。 “T存在):

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) 

(现在不知道过滤掉已经匹配的那些一个好办法,所以试图做到这一点通过自定义标记是‘合并’我已经有一个属性index on)

+0

你能分享你目前正在尝试的吗? – JohnMark13 2014-09-04 17:22:04

+0

我不认为这可以在没有更多上下文的情况下得到回答(并且将您的问题与您的更新相匹配,我假设工作==课程和== offered_in)。您是使用现有数据进行操作还是这是批量导入?你能告诉我们关于你的系统设置的一些信息吗?而不是'合并',你可以使用WHERE NOT(j) - [:in] - >()。 – JohnMark13 2014-09-04 19:22:52

+0

您是否通过浏览器界面看到超时? – 2014-09-04 21:40:41

回答

2

500000是一个公平的f新节点和你提出的另外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) 

很明显,你可以根据需要添加限制。

+0

它是5,000,000个节点。由于某种原因,我有(和这一个)的查询产生吨重复城市... 我已经放弃,只是写了一个python脚本手动做小块。将永远占用,但似乎具有独特性,并做我需要的东西。 在一个相关的说明中,我试着玩“CREATE UNIQUE”(因为这个应该保证件的唯一性),但它一直告诉我“不受限制的模式”或不应该使用它方式(或沿着这些线),所以从来没有得到那个工作。 – Diaspar 2014-09-05 20:26:00

+1

您定义了哪些索引,并且如上所述使用了两个合并语句?由于无匹配的未绑定模式,单个合并('MERGE(j) - [:IN] - >(c:City {name:jcity})')会产生重复。你能否用更多的信息更新你的问题(你曾经尝试过什么,失败了),因为这应该是完全可能的! – JohnMark13 2014-09-06 07:08:55

相关问题