这更像是一个最佳实践问题。我正在为高度结构化的数据实现搜索后端,实质上,这些数据由本体,术语和它们之间的一组复杂映射组成。 Neo4j看起来很自然,经过一些原型设计后我决定使用py2neo作为与neo4j进行通信的方式,主要是因为对批处理操作的支持很好。这更像是一个最佳实践问题。
我感到沮丧的是,我在代码中引入了我想要的更高级抽象类型时遇到了麻烦 - 我坚持将对象直接用作迷你orm ,但后来我正在进行大量的原子休息调用,这会导致性能下降(我有一个相当大的数据集)。
我一直在做的是获取我的查询结果,使用它们上的get_properties来批量水合我的对象,这对于预先形成的很好,这就是为什么我首先沿着这条路走下去,但这让我传递了元组我的代码中的(节点,属性),它完成了工作,但并不漂亮。一点都不。
所以我想我要问的是,在py2neo中使用相当丰富的对象图是否有一个最佳实践,稍后在保留性能的同时获得类似ORM的细节(在我的情况下意味着做同样多的事情)尽可能作为批量查询)
答案 0 :(得分:4)
我不确定我是否明白你想要什么,但我有类似的问题。我想做很多调用并创建很多节点,索引和关系..(大约120万)。以下是使用py2neo
批量添加节点,关系,索引和标签的示例from py2neo import neo4j, node, rel
gdb = neo4j.GraphDatabaseService("<url_of_db>")
batch = neo4j.WriteBatch(gdb)
a = batch.create(node(name='Alice'))
b = batch.create(node(name='Bob'))
batch.set_labels(a,"Female")
batch.set_labels(b,"Male")
batch.add_indexed_node("Name","first_name","alice",a) #this will create an index 'Name' if it does not exist
batch.add_indexed_node("Name","first_name","bob",b)
batch.create(rel(a,"KNOWS",b)) #adding a relationship in batch
batch.submit() #this will now listen to the db and submit the batch records. Ideally around 2k-5k records should be sent
答案 1 :(得分:2)
既然你要求最佳实践,这是我遇到的一个问题:
当批量添加py2neo的大量节点(~1M)时,当neo4j服务器内存不足时,我的程序经常变慢或崩溃。作为一种解决方法,我分批分批提交:
from py2neo import neo4j
def chunker(seq, size):
"""
Chunker gets a list and returns slices
of the input list with the given size.
"""
for pos in xrange(0, len(seq), size):
yield seq[pos:pos + size]
def submit(graph_db, list_of_elements, size):
"""
Batch submit lots of nodes.
"""
# chunk data
for chunk in chunker(list_of_elements, size):
batch = neo4j.WriteBatch(graph_db)
for element in chunk:
n = batch.create(element)
batch.add_labels(n, 'Label')
# submit batch for chunk
batch.submit()
batch.clear()
我尝试了不同的块大小。对我来说,每批约1000个节点最快。但我想这取决于你的neo4j服务器的RAM / CPU。