用python坚持使用neo4j



嗨,我会努力保持正轨,但我做了很多研究,现在我只是输了。我真的可以在这里使用一些专业知识。以下是情况:

前言

这是我在这里的问题的后续问题。问题是我的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 来获取用户关系。'

我被困在哪里

  1. 确认是的,Bolt司机很慢,我没有做错任何事。因为我看到的所有帖子都是一年前的
  2. 我的查询具有ORAND条件,如何在neo4jREST调用中使用参数编写这些条件。
  3. 我应该参考其他graph数据库吗?
  4. 有什么方法可以触发多达 10 个查询并获得低于200ms的响应时间?

认为我错过了某些东西的其他原因:

  1. 传说,neo4j是最受欢迎的graph database。这样的驱动程序怎么可能?
  2. 超过 1 年的报告问题与
  3. 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的并且必须ctsan francisco,我该如何使用REST中的参数来做到这一点怎么办

编辑:

我复制了脚本,以下是判决:

58 笔交易,TPS 0.97 最大延迟 1.08

curl示例请求是从邮递员发出的请求。我正在使用的代码可以从链接的问题(在前言中)中找到。

编辑

老实说,问题出在我使用localhostIP,解决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语句。每个语句都可以有自己的一组参数。

最新更新