2014-09-26 98 views
1
MERGE (n : Person { id : 1000) 
MERGE (m : Item { id : 2000}) 
SET m.name ='xyz' 
MERGE (n)-[r:Buy]->(m) 

我想这种类型的数据(约10K +)上传到的Neo4j但MERGE查询变得很慢执行,因为对于每个合并它所需要的节点空间的全扫描验证给定属性不存在其他项目。Neo4j的MERGE查询

有什么办法解决这个问题吗?

+0

你对人的约束或索引。 id和Item.id? – 2014-09-26 06:07:28

+0

我尝试了CREATE CONSTRAINT ON(person:Person)ASSERT person.id IS UNIQUE CREATE CONSTRAINT ON(item:Item)ASSERT item.id IS UNIQUE,但随着数据的增长,它的速度再次下降.. CREATE INDEX ON:Person (id) CREATE INDEX ON:Item(id) – Sreejithc321 2014-09-27 06:55:39

回答

0

如果您对:Person:Item节点的id属性定义了唯一约束,则这些节点将变为索引并且将被更有效地扫描。

你需要看起来像这样的语法:

CREATE CONSTRAINT ON (person:Person) ASSERT person:id IS UNIQUE 
CREATE CONSTRAINT ON (item:Item) ASSERT item:id IS UNIQUE 

你可以找到更多关于这里唯一约束:

http://docs.neo4j.org/chunked/stable/query-constraints.html

+0

我尝试了CREATE CONSTRAINT ON(person:Person)ASSERT person.id IS UNIQUE CREATE CONSTRAINT ON(item:Item)ASSERT item.id IS UNIQUE也CREATE INDEX ON:Person( id) CREATE INDEX ON:Item(id),但随着数据增长,其速度会减慢。 – Sreejithc321 2014-09-27 06:56:42

+0

您运行此计算机的计算机的规格是什么?您合并了多少个节点,并且您是在单个Cypher语句中还是在多个语句中执行它们? – 2014-09-27 07:58:35

+0

我们使用的是一个中等的EC2实例,原始文件位于S3(采用JSON格式),我们的python程序从S3获取记录并将其写入Neo(在EC2中)密码为 - neoBatch.append_cypher(“MERGE(n :person {id:'“+ usrId +''})MERGE(m:Item {id:'”+ lik [0] +“'})SET m.name ='”+ lik [1] +“'SET m .category ='“+ lik [2] +”'MERGE(n) - [r:Like {name:'Like'}] - >(m)“) \t \t neoBatch.submit() – Sreejithc321 2014-09-28 07:59:56