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(替换为实际对应版本)
- 查看Docker中Neo4j版本:执行
- 简化连接配置:
移除多余的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
相关产品推荐
相关产品推荐

