1 原生引擎 neo4j-python 引擎
官方反馈是自动事务提交。踩坑少
阿里问题:
py2neo 偶尔异常问题(int 和none 不可比)—> 换原生引擎
原生引擎,偶尔异常问题(自动事务会好一些)—> 换自动事务
自动事务,慢的问题【原因:图谱默认生命周期和连接最大数】—> 加上生命周期和最大数限制【生命周期选最大cql执行时间,最大连接数可以结合QPS设置】
import time
### 官方示例
import neo4j
from neo4j import GraphDatabase
class HelloWorldExample(object):
def __init__(self, uri, user, password):
self._driver = GraphDatabase.driver(uri,
auth=(user, password),max_connection_lifetime=200
encrypted=False)
def close(self):
self._driver.close()
## 自动事务,推荐
def read_auto_transaction(self):
try:
data = self._driver.session().run("MATCH (a: test {creationDate:'1279582901279'}) RETURN a").data()
print("data: {}".format(data))
except Exception as e:
# 访问异常的错误编号和详细信息
print("cypher exception in KG {} === {}, data {}".format(e.args, str(e), data))
# 事务,有问题
def read_with_session(self, message):
with self._driver.session() as session:
greeting = session.write_transaction(
self._create_and_return_greeting, message)
print(greeting)
@staticmethod
def _create_and_return_greeting(tx, message):
result = tx.run(
"CREATE (a:Greeting) "
"SET a.message = $message "
"RETURN a.message + ', from node ' + id(a)",
message=message)
return result.single()[0]
if __name__ == '__main__':
#print(neo4j.GraphDatabase.__version__)
e = HelloWorldExample('bolt://127.0.0.1:3002', 'admin', 'admin')
for i in range(1):
r = e.read()
#time.sleep(1)
# 事务性,不建议
def ParseCypher(cypher, keys):
with graph.session() as session:
with session.begin_transaction() as tx:
data = []
result = tx.run(cypher)
for record in result:
item = {}
for key in keys:
item = {key: record[key]}
data.append(item)
data.append(item)
return data
GDB ali 图谱会有一些需要注意的点:
如下:
图谱注意事项:graph 建立连接的时候需要设置每个连接生命周期和最大连接数。
方案1:
达到最大生命周期后自动释放链接:
self.graph.session().run(cql)
注意:最大连接数需要设置,最大生命周期需要设置
方案2:
with 自动释放连接:
with session = graph.session() as session:
data = session.run(cql)
注意:最大连接数需要设置,最大生命周期可取默认
如果是需要遍历data对象,需要在with 内,否则结果为空,因为连接已经释放了
方案3:
手动释放链接。
如果是需要遍历data对象,需要在close之前,否则结果为空,因为连接已经释放了
session = graph.session()
try:
data = session.run(cql)
except Exception as e:
logger.warning("cypher exception in KG {} === {}".format(e.args, str(e)))
finally:
session.close()
2 py2neo的坑
问题描述:py2neo连接阿里云图数据库GDB,非常小概率出现’>’ not supported between
问题定位:主要还是bolt协议再演进,py2neo 4.1.0是19年的版本,处理bolt协议时没考虑buffer后为noop的条件;
建议解决方案:
可以使用py2neo 2021.1新版本 或者直接用neo4j-python-driver都可以
版本建议:
分析过程: