You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Neo4j后py2neo可连接但neo4j官方库连接失败求助

0
但使用Neo4j官方Python库连接时:
```python
from neo4j import GraphDatabase, TRUST_ALL_CERTIFICATES
trust=TRUST_ALL_CERTIFICATES

neo4j_user="neo4j"
neo4j_passwd="XXXXXXX"
uri="bolt://localhost:7687"
driver = GraphDatabase.driver(uri, 
                       auth=(neo4j_user, neo4j_passwd),
                       encrypted=False, trust=trust)

出现以下错误:

File ~/local/anaconda3/lib/python3.8/site-packages/neo4j/__init__.py:120, in GraphDatabase.driver(cls, uri, **config)
    114 @classmethod
    115 def driver(cls, uri, **config):
    116     """ Create a :class:`.Driver` object. Calling this method provides
    117     identical functionality to constructing a :class:`.Driver` or
    118     :class:`.Driver` subclass instance directly.
    119     """
--> 120     return Driver(uri, **config)

File ~/local/anaconda3/lib/python3.8/site-packages/neo4j/__init__.py:161, in Driver.__new__(cls, uri, **config)
    159 for subclass in Driver.__subclasses__():
    160     if parsed_scheme in subclass.uri_schemes:
--> 161         return subclass(uri, **config)
    162 raise ValueError("URI scheme %r not supported" % parsed.scheme)

File ~/local/anaconda3/lib/python3.8/site-packages/neo4j/__init__.py:235, in DirectDriver.__new__(cls, uri, **config)
    232     return connect(address, **dict(config, **kwargs))
    234 pool = ConnectionPool(connector, instance.address, **config)
--> 235 pool.release(pool.acquire())
    236 instance._pool = pool
    237 instance._max_retry_time = config.get("max_retry_time", default_config["max_retry_time"])

File ~/local/anaconda3/lib/python3.8/site-packages/neobolt/direct.py:715, in ConnectionPool.acquire(self, access_mode)
    714 def acquire(self, access_mode=None):
--> 715     return self.acquire_direct(self.address)

File ~/local/anaconda3/lib/python3.8/site-packages/neobolt/direct.py:608, in AbstractConnectionPool.acquire_direct(self, address)
    606 if can_create_new_connection:
    607     try:
--> 608         connection = self.connector(address, error_handler=self.connection_error_handler)
    609     except ServiceUnavailable:
    610         self.remove(address)

File ~/local/anaconda3/lib/python3.8/site-packages/neo4j/__init__.py:232, in DirectDriver.__new__.<locals>.connector(address, **kwargs)
    231 def connector(address, **kwargs):
--> 232     return connect(address, **dict(config, **kwargs))

File ~/local/anaconda3/lib/python3.8/site-packages/neobolt/direct.py:972, in connect(address, **config)
    970     raise ServiceUnavailable("Failed to resolve addresses for %s" % address)
    971 else:
--> 972     raise last_error

File ~/local/anaconda3/lib/python3.8/site-packages/neobolt/direct.py:964, in connect(address, **config)
    962     s = _connect(resolved_address, **config)
    963     s, der_encoded_server_certificate = _secure(s, host, security_plan.ssl_context, **config)
--> 964     connection = _handshake(s, address, der_encoded_server_certificate, **config)
    965 except Exception as error:
    966     last_error = error

File ~/local/anaconda3/lib/python3.8/site-packages/neobolt/direct.py:920, in _handshake(s, resolved_address, der_encoded_server_certificate, **config)
    918 if agreed_version == 0:
    919     log_debug("[#%04X]  C: <CLOSE>", local_port)
--> 920     s.shutdown(SHUT_RDWR)
    921     s.close()
    922 elif agreed_version in (1, 2):

OSError: [Errno 57] Socket is not connected

请问为何py2neo可正常连接,而Neo4j官方库连接失败?


解决方案

这个问题的核心是Neo4j官方Python驱动版本与Docker中Neo4j版本不兼容,或驱动配置参数使用不当:

1. 版本不匹配

py2neo对Neo4j版本兼容性更广,而官方驱动对版本匹配要求更严格。如果Docker中的Neo4j是较新版本(如5.x),但使用的官方驱动是旧版本(如4.x及以下),会出现握手失败——错误日志里的agreed_version == 0说明驱动与服务器无法协商出兼容的Bolt协议版本。

2. 冗余配置干扰

你同时设置了encrypted=False和trust=TRUST_ALL_CERTIFICATES,对于非加密的bolt://连接,trust参数完全多余,可能干扰连接流程。

修复步骤:

  • 匹配驱动与Neo4j版本:
    • 查看Docker中Neo4j版本:执行 docker exec testneo4j neo4j --version
    • 安装对应版本的官方驱动:比如Neo4j是5.x,就安装5.x系列驱动,命令示例:pip install neo4j==5.15.0(替换为实际对应版本)
  • 简化连接配置:
    移除多余的trust参数,修改后的代码如下:
    from neo4j import GraphDatabase
    
    neo4j_user = "neo4j"
    neo4j_passwd = "XXXXXXX"
    uri = "bolt://localhost:7687"
    driver = GraphDatabase.driver(uri, auth=(neo4j_user, neo4j_passwd), encrypted=False)
    
    # 测试连接
    with driver.session() as session:
        result = session.run("MATCH(x) RETURN COUNT(x)")
        print(result.single()[0])
    
  • 验证容器与端口状态:
    确认容器正常运行:docker ps,检查7687端口映射:netstat -tulpn | grep 7687

内容的提问来源于stack exchange,提问作者femibyte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:05:50