2013-04-07 53 views
3

正确的做法这更是一个最佳实践的问题。我正在为高度结构化的数据实现搜索后端,实质上,这些数据由本体,术语以及它们之间的一组复杂映射组成。 Neo4j看起来很合适,在做了一些原型设计后,我决定用py2neo作为与neo4j进行通信的一种方式,主要是因为对批量操作的支持很好。这比任何事都更像是一个最佳实践问题。水合物大量实体在py2neo

我感到沮丧的是,我在介绍需要在代码中使用的更高级抽象类型时遇到了问题 - 我坚持使用对象直接作为mini- orm,但后来我做了很多很多的原子休息调用,这会导致性能下降(我有一个相当大的数据集)。

我一直在做的是得到我的查询结果,使用它们的get_properties批量水合我的对象,这是很好的预制件,这就是为什么我首先下了这条路线,但这使得我传递元组(代码,属性)在我的代码中,它完成了工作,但并不漂亮。在所有。

所以我想我要问的是,如果在py2neo中有一个相当丰富的对象图的最佳实践,在保留性能的同时获得ORM类的细微差别(在我的情况下意味着要做可能就像批量查询)

回答

3

我不知道我是否明白你想要什么,但我也有类似的问题。我想拨打很多电话,并创建了很多节点,索引和关系......(大约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 
+0

我的评论似乎有点偏离主题,但在这里不用无论如何:如果您运行此一次,然后检查'gdb.order'它会显示2(用于Alice和Bob)。如果你再次运行它,你会得到4号命令,因为你正在创建节点而不检查它们的唯一性(例如,通过使用'batch.get_or_create_indexed_node(...)')。所以这个代码只有在你知道你的节点是唯一的时候才会起作用。用'get_or_create_indexed_node'的问题是,返回值[似乎不工作(http://stackoverflow.com/q/20010509/1174169)与'set_labels'或'set_properties'(py2neo 1.6.1,Neo4j的2.0的3.0 RC1) – cod3monk3y 2013-12-12 04:24:39

1

由于您的要求的最佳实践添加节点,关系,索引和标签批量的例子,这里是我遇到了一个问题:

当加入了很多节点( 〜1M)与py2neo在一个批次中,我的程序经常变慢或崩溃时,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。