Performance can';t复制/验证graph数据库中的性能声明和行动手册中的neo4j

Performance can';t复制/验证graph数据库中的性能声明和行动手册中的neo4j,performance,neo4j,Performance,Neo4j,更新我提出了一个后续问题,其中包含更新的脚本和更清晰的设置。请继续。/UPDATE 我在验证“图形数据库”一书(第20页)和neo4j(第1章)中的性能声明时遇到了一些问题 为了验证这些声明,我创建了一个包含100000个“个人”条目的样本数据集,每个条目有50个“朋友”,并尝试查询4跳以外的朋友。我在mysql中使用了完全相同的数据集。与好友的好友通话超过4次mysql只需0.93秒即可返回,而neo4j需要65-75秒(重复通话) 我如何改善这一悲惨的结果,并验证书中的说法? 更详细一点:

更新我提出了一个后续问题,其中包含更新的脚本和更清晰的设置。请继续。/UPDATE

我在验证“图形数据库”一书(第20页)和neo4j(第1章)中的性能声明时遇到了一些问题

为了验证这些声明,我创建了一个包含100000个“个人”条目的样本数据集,每个条目有50个“朋友”,并尝试查询4跳以外的朋友。我在mysql中使用了完全相同的数据集。与好友的好友通话超过4次mysql只需0.93秒即可返回,而neo4j需要65-75秒(重复通话)

我如何改善这一悲惨的结果,并验证书中的说法?

更详细一点: 我使用ubuntu12.04 64位、java版本“1.7.0_25”和mysql 5.5.31、neo4j-community-2.0.0-M03在一个16GB Ram的i5-3570K上运行整个安装程序(我得到了与1.9类似的结果)

可以在上找到所有代码/示例数据(与2.0.0一起使用)。可以在上找到不同格式的结果示例数据

要使用这些脚本,您需要一个安装了mysql-python、requests和simplejson的python

  • 数据集是使用friendsdata.py创建的,并存储到friends.pickle
  • 使用import_friends_neo4j.py将friends.pickle导入到neo4j
  • pickle使用import\u friends\u mysql.py导入到mysql
  • 我在mysql中的t_user_friend.*上添加了索引
  • 我在neo4j中添加了“在节点(noscenda_名称)上创建索引”
为了让生活更轻松,friends.*.bz2包含sql和cypher语句,用于在mysql和neo4j 2.0 M3中创建这些数据集

Mysql性能 我首先通过查询来预热mysql:

select count(distinct name) from t_user;
select count(distinct name) from t_user;
那么,为了真正的保证,我做了

python query_friends_mysql.py 4 10
这将创建以下sql语句(更改t_用户名):

并将此4跳查询重复10次。每个查询大约需要0.95秒。Mysql配置为使用4G的密钥缓冲区

neo4j性能测试 我已经修改了neo4j.properties:

neostore.nodestore.db.mapped_memory=25M
neostore.relationshipstore.db.mapped_memory=250M
以及neo4j-wrapper.conf:

wrapper.java.initmemory=2048
wrapper.java.maxmemory=8192
要预热neo4j,我需要

start n=node(*) return count(n.noscenda_name);
start r=relationship(*) return count(r);
然后我开始使用事务性http端点(但是我使用neo4j shell得到了相同的结果)

还在热身,我跑了

./bin/python query_friends_neo4j.py 3 10
这将创建表单查询(具有不同的人员ID):

在第7次通话后,每次通话大约需要0.7-0.8秒

现在来看看我真正做的事情(4跳)

创造

{"statement": "match n:node-[r*4..4]->m:node where n.noscenda_name={target} return count(r);", "parameters": {"target": "person3089"}
每次通话需要65到75秒

开放性问题/想法 我真的希望书中的声明是可复制和正确的,neo4j比mysql快,而不是慢

但我不知道我做错了什么…:-(

因此,我最大的希望是:

  • 我没有正确设置neo4j的内存
  • 我对neo4j使用的查询是完全错误的
我们非常欢迎任何关于neo4j升级的建议

非常感谢


Joerg 2.0根本没有经过性能优化,所以您应该使用1.9.2进行比较。 (如果使用2.0-是否为n.noscenda_name创建索引)

您可以使用
配置文件开始…
检查查询计划

对于1.9,请使用手动索引或
noscenda\u名称的
node\u自动索引

您可以尝试以下查询:

start n=node:node_auto_index(noscenda_name={target})
match n-->()-->()-->m
return count(*);
全文索引也比精确索引更昂贵,因此请为
noscenda\u name
保留
exact
自动索引

无法让您的导入程序运行,它会在某个时候失败,也许您可以共享完成的neo4j数据库

python importer.py
reading rels
reading nodes
delete old
Traceback (most recent call last):
  File "importer.py", line 9, in <module>
    g.query('match n-[r]->m delete r;')
  File "/Users/mh/java/neo/neo4j-experiements/neo4jconnector.py", line 99, in query
    return self.call(payload)
  File "/Users/mh/java/neo/neo4j-experiements/neo4jconnector.py", line 71, in call
    self.transactionurl = result.headers['location']
  File "/Library/Python/2.7/site-packages/requests-1.2.3-py2.7.egg/requests/structures.py", line 77, in __getitem__
    return self._store[key.lower()][1]
KeyError: 'location'
python importer.py
阅读关系
读取节点
删除旧的
回溯(最近一次呼叫最后一次):
文件“importer.py”,第9行,在
g、 查询('match n-[r]->m delete r;')
文件“/Users/mh/java/neo/neo4j experiements/neo4jconnector.py”,第99行,在查询中
返回自呼叫(有效负载)
文件“/Users/mh/java/neo/neo4j experiements/neo4jconnector.py”,第71行,调用中
self.transactionurl=result.headers['location']
文件“/Library/Python/2.7/site packages/requests-1.2.3-py2.7.egg/requests/structures.py”,第77行,在__
返回self.\u存储[key.lower()][1]
KeyError:“位置”

为了补充Michael所说的,我相信作者在书中提到的是Neo4j《行动》一书中所做的一个比较——在

在第7页的顶部,他们解释说他们使用的是密码而不是密码


我认为目前您将很难让Cypher接近该性能级别,因此如果您想要执行这些类型的查询,您将希望直接使用Traversal API,然后可能将其封装在一个新的API中。

请注意,“Neo4j正在运行”“这本书使用了嵌入式Java API,cypher并没有经过太多的优化。Yetthank对这个提示表示感谢。'Neo4j in Action'这本书实际上使用了遍历API(因此将苹果和橙子进行比较,imho)。图形数据库完全忽略了这一点。不过,我怀疑我是否能够使用遍历api。此外,遍历api是否具有不同的缩放行为?在示例中,查询3个跃点需要0.7秒,查询4个跃点需要60秒。我希望在(my)上看到使用遍历api的示例已发布的示例数据。即使使用traversal API,2.0-M03的遍历速度也比1.9慢,因为它是在任何类型的性能保证开始之前发布的。M04可能会更接近1.9,但在里程碑版本上进行性能测量意味着所有赌注都没有了。非常感谢您对此进行研究。首先,发布的脚本正在处理事务http端点(2.0.0M3)。我已将1.9.2的数据目录上载到。我使用2.0和1.9.2的索引查找noscenda_名称-无论如何,此查找时间应该是恒定的。查询3个跃点仍然只需要0.7秒(参见原始问题)。我不这么认为
{"statement": "match n:node-[r*4..4]->m:node where n.noscenda_name={target} return count(r);", "parameters": {"target": "person3089"}
start n=node:node_auto_index(noscenda_name={target})
match n-->()-->()-->m
return count(*);
python importer.py
reading rels
reading nodes
delete old
Traceback (most recent call last):
  File "importer.py", line 9, in <module>
    g.query('match n-[r]->m delete r;')
  File "/Users/mh/java/neo/neo4j-experiements/neo4jconnector.py", line 99, in query
    return self.call(payload)
  File "/Users/mh/java/neo/neo4j-experiements/neo4jconnector.py", line 71, in call
    self.transactionurl = result.headers['location']
  File "/Library/Python/2.7/site-packages/requests-1.2.3-py2.7.egg/requests/structures.py", line 77, in __getitem__
    return self._store[key.lower()][1]
KeyError: 'location'