【发布时间】:2021-07-05 08:00:00
【问题描述】:
是否有使用 neo4j python 驱动程序的简单示例? 如何将密码查询传递给驱动程序以运行并返回游标?
如果我正在阅读 for example this,那么该演示似乎有一个类包装器,我将一个私有成员 func 传递给 session.write,
session.write_transaction(self._create_and_return_greeting, ...
然后以事务作为第一个参数调用它...
def _create_and_return_greeting(tx, message):
依次运行密码
result = tx.run("CREATE (a:Greeting) "
这似乎比需要的复杂 10 倍。
我只是尝试了一个更简单的:
def raw_query(query, **kwargs):
neodriver = neo_connect() # cached dbconn
with neodriver.session() as session:
try:
result = session.run(query, **kwargs)
return result.data()
但这会导致查询出现套接字错误,可能是因为会话超出范围?
[dfcx/__init__] ERROR | Underlying socket connection gone (_ssl.c:2396)
[dfcx/__init__] ERROR | Failed to write data to connection IPv4Address(('neo4j-core-8afc8558-3.production-orch-0042.neo4j.io', 7687)) (IPv4Address(('34.82.120.138', 7687)))
我也不能返回游标/迭代器,只能返回 data()
当会话超出范围时,查询结果似乎随之消失。
如果我手动打开和关闭会话,我会遇到同样的问题吗?
Python 一定是这个 DB 最流行的语言,每个人都使用不同的驱动程序吗?
Py2neo 看起来很可爱,但是对于大多数 cypher 语言功能来说完全缺乏 ORM 包装器功能,所以无论如何你都必须使用原始密码。而且我不确定它是否以同样的方式支持**kwargs 参数插值。
我想大加薪应该有助于解决一些问题:D
稍长的版本试图获得一个有效的数据库包装器:
def neo_connect() -> Union[neo4j.BoltDriver, neo4j.Neo4jDriver]:
global raw_driver
if raw_driver:
# print('reuse driver')
return raw_driver
neoconfig = NEOCONFIG
raw_driver = neo4j.GraphDatabase.driver(
neoconfig['url'], auth=(
neoconfig['user'], neoconfig['pass']))
if raw_driver is None:
raise BaseException("cannot connect to neo4j")
else:
return raw_driver
def raw_query(query, **kwargs):
# just get data, no cursor
neodriver = neo_connect()
session = neodriver.session()
# logging.info('neoquery %s', query)
# with neodriver.session() as session:
try:
result = session.run(query, **kwargs)
data = result.data()
return data
except neo4j.exceptions.CypherSyntaxError as err:
logging.error('neo error %s', err)
logging.error('failed query: %s', query)
raise err
# finally:
# logging.info('close session')
# session.close()
更新:有人向我指出了这个示例,这是使用 tx 包装器的另一种方式。
https://github.com/neo4j-graph-examples/northwind/blob/main/code/python/example.py#L16-L21
【问题讨论】: