Neo4j之python连接失败解决(py2neo)

本文简述在 python 中使用 py2neo 连接 Neo4j 及连接时可能遇到的问题和解决方法。

使用 pip 工具安装 py2neo 。

1
pip install py2neo

若已安装 pip 仍提示 pip : command not found ,可以切换到到 Python 的安装目录<Installation floder>\Scripts目录下,使用以下命令安装:

1
./pip install py2neo

由于网络原因,有可能多次下载失败,这种情况可以选择到 PyPI 手动下载py2neo package ,再使用 pip 进行安装:

1
pip install THE_PACKAGE_PATH

导入 py2neo :

1
>>>import py2neo

调用 py2neo.Graph() 函数连接Neo4j中已有的图:

1
>>>graph=py2neo.Graph("bolt://localhost:7687")

注:这里的端口是一般情况下的默认端口号,在该端口被占用的情况下Neo4j启用的访问端口可能并不是此端口号。

此时并不能看出连接是否成功,可以使用查询语句查看是否能查询到结果,若连接成功,则此时可以使用图实例所提供的各项功能,py2neo 中提供了对节点、关系,以及各类操作的方法,也可以调用 Cypher 语句进行操作。

这里我们通过调用 len() 函数对节点进行计数来查看连接状态:

1
>>>len(graph.nodes)

若连接不成功,可能看到以下错误提示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Traceback (most recent call last): 
File "E:\Python\lib\site-packages\py2neo\database.py", line 828, in run entities=entities))
File "E:\Python\lib\site-packages\py2neo\internal\connectors.py", line 292, in run return self._run_1(statement, parameters, graph, keys, entities)
File "E:\Python\lib\site-packages\py2neo\internal\connectors.py", line 241, in _run_1cx = self.pool.acquire()
File "E:\Python\lib\site-packages\neobolt\direct.py", line 715, in acquire return self.acquire_direct(self.address)
File "E:\Python\lib\site-packages\neobolt\direct.py", line 608, in acquire_direct connection = self.connector(address, error_handler=self.connection_error_handler)
File "E:\Python\lib\site-packages\py2neo\internal\connectors.py", line 227, in connector encrypted=cx_data["secure"], **kwargs)
File "E:\Python\lib\site-packages\neobolt\direct.py", line 972, in connect raise last_error
File "E:\Python\lib\site-packages\neobolt\direct.py", line 964, in connect connection = _handshake(s, address, der_encoded_server_certificate, **config)
File "E:\Python\lib\site-packages\neobolt\direct.py", line 932, in _handshake connection.hello()
File "E:\Python\lib\site-packages\neobolt\direct.py", line 249, in hello self.sync()
File "E:\Python\lib\site-packages\neobolt\direct.py", line 527, in sync detail_delta, summary_delta = self.fetch()
File "E:\Python\lib\site-packages\neobolt\direct.py", line 419, in fetch return self._fetch()
File "E:\Python\lib\site-packages\neobolt\direct.py", line 461, in _fetch response.on_failure(summary_metadata or {})
File "E:\Python\lib\site-packages\neobolt\direct.py", line 774, in on_failure raise AuthError(message)
neobolt.exceptions.AuthError: The client is unauthorized due to authentication failure. During handling of the above exception, another exception occurred: Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "E:\Python\lib\site-packages\py2neo\matching.py", line 196, in __len__ return len(self.match())
File "E:\Python\lib\site-packages\py2neo\matching.py", line 80, in __len__ return self.graph.evaluate(*self._query_and_parameters(count=True))
File "E:\Python\lib\site-packages\py2neo\database.py", line 395, in evaluate return self.begin(autocommit=True).evaluate(cypher, parameters, **kwparameters)
File "E:\Python\lib\site-packages\py2neo\database.py", line 876, in evaluate return self.run(cypher, parameters, **kwparameters).evaluate(0)
File "E:\Python\lib\site-packages\py2neo\database.py", line 830, in run raise GraphError.hydrate({"code": error.code, "message": error.message})
File "E:\Python\lib\site-packages\py2neo\database.py", line 676, in hydrate_, classification, category, title = code.split(".") AttributeError: 'NoneType' object has no attribute 'split'

可以看到是身份验证失败而产生的错误。这是由于连接时未设置用户名和密码导致的,默认用户名为 neo4j,密码为password,而 Neo4j 默认密码为 neo4j ,因此导致了认证失败,同时在第一次开启图数据库时 Neo4j 会提示设立身份验证方式,此时设置的密码将用于登录,若使用 Neo4j Browser,并不会在每一次登陆时都提示身份验证,因此并未注意到这一点。在 Neo4j Browser 中使用 server user list 可以看到此时有名为 neo4j 的使用者。可以使用 server user add 命令添加一个用户,用此用户作为 Graph()auth 项参数登录即可。

1
>>>graph=py2neo.Graph("bolt://localhost:7687", auth=('username', 'password'))

注:在查找此问题的解决方式时看到有提议用 neo4j-admin 工具修改初始密码,在 Windows 下,此工具并不是直接以 *.exe 的可执行文件出现,而是 *.bat 的批处理文件,并且在 Neo4j Desktop 版本下此工具不是位于 <Installation Folder>/bin ,而应该切换至 <Database Folder>/bin 目录下,运行以下命令:

1
./neo4j-admin.bat YOURCOMMAND

但在此操作应该是在数据库未建立时,否则,将会提示此时的权限已经转移到 <Database Folder>/data/dbms/ 下的 auth 文件中,如果要重设密码应该移除 authrole 相关文件或者重设该数据库,所以并不能使用此方式,新建一个用户应该是一个比较好的选择。