嗨,我会努力保持正轨,但我做了很多研究,现在我只是输了。我真的可以在这里使用一些专业知识。以下是情况:
前言
这是我在这里的问题的后续问题。问题是我的cypher
查询至少需要1 second
才能返回响应。甚至像RETURN 123
这样的查询也需要1 second
。由此得出的结论是,Neo4j Bolt Driver for Python 比实际的http
调用neo4j
慢。
我可以用 GitHub Issues 的研究和 stackoverflow 的研究来支持这一点
问题陈述
每次我的代码运行时,它都会生成多达 10 个Cypher
查询,所有这些查询都必须触发,然后需要根据结果执行操作。
问题是使用
Bolt
查询需要1 second
才能执行,并且HTTP
我卡住了。由于我想使用Query Parameters
使查询更快,因为现在它并不Bolt
,因为现在每个http
调用都需要30ms
,将其乘以 10 {因为我有 10 个查询},你有一个性能非常差的 python API 来获取用户关系。'
我被困在哪里
- 确认是的,
Bolt
司机很慢,我没有做错任何事。因为我看到的所有帖子都是一年前的 - 我的查询具有
OR
和AND
条件,如何在neo4j
REST
调用中使用参数编写这些条件。 - 我应该参考其他
graph
数据库吗? - 有什么方法可以触发多达 10 个查询并获得低于
200ms
的响应时间?
认为我错过了某些东西的其他原因:
- 传说,
neo4j
是最受欢迎的graph database
。这样的驱动程序怎么可能?
超过 1 年的报告问题与 BOLT drivers
,他们仍未解决这些问题。
样品请求
curl -X POST
http://localhost:7474/db/data/cypher
-H 'Authorization: Basic bmVvNGo6Y29kZQ=='
-H 'Cache-Control: no-cache'
-H 'Content-Type: application/json'
-d '{
"query" : "MATCH (ct:city)-[:CHILD_OF]->(st:state) WHERE (st.name_wr = {st}) AND (ct.name_wr= {ct}) RETURN st, ct",
"params":
{
"st" : "california",
"ct" : "san francisco"
}
}'
但是,如果我想添加一个子句,要么st
应该California
,要么可以是Alaska
的并且必须ct
san francisco
,我该如何使用REST
中的参数来做到这一点怎么办
编辑:
我复制了脚本,以下是判决:
58 笔交易,TPS 0.97 最大延迟 1.08
curl
示例请求是从邮递员发出的请求。我正在使用的代码可以从链接的问题(在前言中)中找到。
编辑
老实说,问题出在我使用localhost
IP
,解决localhost
需要时间。一旦我切换到127.0.0.1
它就开始工作得很好。
将此标记为答案,因为此答案有助于实际对导致发现该问题的两种方法进行基准测试host resolution
我认为您的设置一定有问题。我一直在使用 python bolt 驱动程序已经有一段时间了,对于简单的查询,我想我从来没有见过 1 秒的延迟。我不知道你的代码是什么样子的,或者你的网络延迟,但我写了一个快速的例子来查看我在本地网络中看到的延迟(延迟非常低)。使用 Neo4j 3.2.9 和 python 驱动程序 1.5.3.)
#!/usr/bin/python
from __future__ import print_function
import sys
import time
from neo4j.v1 import GraphDatabase, basic_auth
ip = '10.10.10.10'
runtime = 60.0
querystr = 'RETURN 123'
runstart = time.time()
maxdelay = 0
cnt = 0
#driver = GraphDatabase.driver("bolt+routing://%s:7687" % ip,
driver = GraphDatabase.driver("bolt://%s:7687" % ip,
auth=basic_auth("neo4j", "password"))
while time.time() - runstart < runtime:
start = time.time()
session = driver.session(access_mode='READ')
ret = session.run(querystr)
session.close()
result = ret.data()
cnt += 1
delay = time.time() - start
if delay > maxdelay:
maxdelay = delay
if delay > 0.1:
print('Large delay seen cnt %s delay %0.2f' % (cnt, delay))
print('%d transactions, tps %0.2f maxdelay %0.2f' % (cnt, cnt/runtime, maxdelay))
我得到输出:
117360 事务,TPS 1956.00 最大延迟 0.06
这意味着平均读取大约需要半毫秒,最长时间为 60 毫秒。
我会查看客户端和服务器端的网络延迟和资源问题。
您的示例请求使用的是已弃用的旧版终端节点及其旧版 API。
您应该改用事务端点及其较新的API,特别是因为它支持在单个请求中执行多个Cypher语句。每个语句都可以有自己的一组参数。