【问题标题】:Neo4j slow? I must be doing something wrong, please tell me what it isNeo4j 慢?我一定是做错了什么,请告诉我是什么
【发布时间】:2012-02-03 14:38:43
【问题描述】:

我看到嵌入式 Neo4j 的一些相当不可能的性能结果,从表面上看,它比预期的要慢几个数量级,所以我假设我“做错了”,尽管我没有做任何复杂的事情。

我正在为 Neo4j 使用最新的嵌入式 python 绑定 (https://github.com/neo4j/python-embedded)

from neo4j import GraphDatabase
db = GraphDatabase('/tmp/neo4j')

我已经创建了 1500 个具有简单属性的假产品:

fake_products = [{'name':str(x)} for x in range(0,1500)]

...并从中创建了我连接到子引用节点的节点:

with db.transaction:
    products = db.node()
    db.reference_node.PRODUCTS(products)

    for prod_def in fake_products:
        product = db.node(name=prod_def['name'])        
        product.INSTANCE_OF(products)

现在,在我看来,与我在文档中看到的几乎完全相同的代码:

PRODUCTS = db.getNodeById(1) 
for x in PRODUCTS.INSTANCE_OF.incoming: 
    pass

...在我的 Macbook Pro 上迭代这 1500 个节点需要 >0.2 秒。什么。 (编辑:我当然多次运行这个查询,所以至少在 python 绑定中,这不是冷缓存的问题)

我把它放大到 15k,花了 2s。我下载了 Gremlin 并发出了一个等效的查询来调查它是 neo4j 还是 python 绑定:

g.v(1).in("INSTANCE_OF")

..第一次尝试似乎花了大约 2 秒,第二次运行似乎几乎立即完成。

知道为什么这么慢吗?我得到的结果一定是我犯了某种错误。

【问题讨论】:

    标签: python performance neo4j


    【解决方案1】:

    这是 Neo4j 懒加载数据而不做任何预取。第一次运行时,您正在访问磁盘,第二次,缓存是热的,这是您真正的生产场景。

    【讨论】:

    • 感谢彼得的回答,我假设我创建和连接数据的方式没问题?但是关于你的答案——至少我在 Python 绑定结果中看到的不是这个——上述遍历连续多次运行都需要相同的时间。
    • 那么,在 gremlin/groovy/java 领域它很快,但不是通过 Python?
    • Argh,试图在 OSX Lion 上安装 JPype 但没有成功,想要重现它:/
    • 这是我在 neo4j/python-embedded 和 jakewins 的 github 页面上的报告:github.com/neo4j/python-embedded/issues/15 我想我按照这里的说明让 JPype 工作了:stackoverflow.com/questions/8525193/…
    • 抱歉,回复很白痴,没有意识到按回车键发送评论并且在我说更多之前就发送了:) 无论如何,感谢您的关注。一旦缓存变热,在 gremlin/groovy 中查询 15k 个节点非常快,所以它必须是 python 绑定。我真的对使用 neo4j(和 gremlin,python 绑定似乎不允许的东西)很感兴趣。我现在正在尝试一种方法,让我的 python Web 应用程序连接到由 jython 托管的 zeromq 服务器套接字,该套接字调用 groovy 类来检索结果。维持这个可能会很痛苦,但我现在没有其他办法
    猜你喜欢
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2010-12-14
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    相关资源
    最近更新 更多