在 Neo4j 中使用 python 包(Neomodel 和 py2neo)时出现问题
Problems using python packages (Neomodel & py2neo) with Neo4j
我在将 Neomodel 和 py2neo 客户端与 Neo4j 一起使用时遇到了一些问题。我在单独的 anaconda 虚拟环境中安装了 Neomodel 和 py2neo 并分别进行了测试。 Neo4j 是 installed/docked 使用 docker.
新模型
代码
from neomodel import (config, StructuredNode, StringProperty, IntegerProperty,UniqueIdProperty, RelationshipTo, RelationshipFrom)
config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687'
class Country(StructuredNode):
code = StringProperty(unique_index=True, required=True)
# traverse incoming IS_FROM relation, inflate to Person objects
inhabitant = RelationshipFrom('Person', 'IS_FROM')
class Person(StructuredNode):
uid = UniqueIdProperty()
name = StringProperty(unique_index=True)
age = IntegerProperty(index=True, default=0)
# traverse outgoing IS_FROM relations, inflate to Country objects
country = RelationshipTo(Country, 'IS_FROM')
jim = Person(name='Jim', age=3).save()
jim.age = 4
jim.save() # validation happens here
jim.delete()
jim.refresh() # reload properties from neo
jim.id # neo4j internal id
虽然 Neomodel 生成了在 neo4j webapp 上查看的节点。创建的节点是年龄为 3 的吉姆,即它似乎没有记录吉姆年龄从 3 变为 4 的事实。另外,我假设 jim.delete() 会删除它所做的节点都不是。最后,它提示以下错误(下面是错误最后几行的片段)。
错误
...
File "/Users/sjamal/.conda/envs/tneo/lib/python3.6/site-
packages/neomodel/core.py", line 452, in inflate
if db_property in node.properties:
AttributeError: 'Node' object has no attribute 'properties'
现在我确实找到了这个 post,其中用户 "Jack Daniel" 提到 neomodel 不支持 neo4j 3。所以我尝试对接 Neo4j v.2.3 图像,但随后收到以下错误(请注意,它是错误最后几行的片段)
对接图像Neo4j 2.3时出错
File "/Users/sjamal/.conda/envs/tneo/lib/python3.6/ssl.py", line 817, in __init__
self.do_handshake()
File "/Users/sjamal/.conda/envs/tneo/lib/python3.6/ssl.py", line 1077, in do_handshake
self._sslobj.do_handshake()
File "/Users/sjamal/.conda/envs/tneo/lib/python3.6/ssl.py", line 689, in do_handshake
self._sslobj.do_handshake()
OSError: [Errno 0] Error
Py2neo
由于我在使用 Neomodel 时遇到的问题,我开始考虑使用 p2neo,但我似乎无法正确配置。
代码
from py2neo import Node, Relationship, Graph
graph = Graph("localhost", user='neo4j', password='password', bolt=None)
alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
alice_knows_bob = Relationship(alice, "KNOWS", bob)
graph.create(alice_knows_bob)
错误
File "/Users/sjamal/.conda/envs/py2neo_test/lib/python3.6/site-packages/neo4j/bolt/connection.py", line 459, in acquire
connection = self.connector(address)
File "/Users/sjamal/.conda/envs/py2neo_test/lib/python3.6/site-packages/neo4j/v1/bolt.py", line 46, in <lambda>
pool = ConnectionPool(lambda a: connect(a, security_plan.ssl_context, **config))
File "/Users/sjamal/.conda/envs/py2neo_test/lib/python3.6/site-packages/neo4j/bolt/connection.py", line 601, in connect
raise ProtocolError("Connection to %r closed without handshake response" % (address,))
neo4j.bolt.connection.ProtocolError: Connection to ('localhost', 7687) closed without handshake response
感谢所有对此进行调查的人。我很乐意收到有关如何设置 Py2neo 的任何建议或解释,无论我是否让 Neomodel 工作。
所以我设法解决了 Py2neo 的问题,但没有解决 Neomodel 的问题。如果我确实找到了让 Neomodel 工作的方法,我将 post 它和 link 到此 post 或 post 作为此线程中的评论。
py2neo v4.0 和 neo4j 的 Py2neo 解决方案 v3.o
我尝试了各种组合,从 neo4j 2.3 开始,结合不同版本的 py2neo,例如 3.1.2,然后对 neo4j v3.0 进行了同样的组合。
我正在 post 编写我用来创建节点和图形连接的脚本,因为当我试图弄清楚是我的配置设置不当还是包、驱动程序等
Py2neo 脚本
from py2neo import Node, Relationship, Graph
graph = Graph('http://localhost:7474/db/data',user='neo4j',pass word='password1234')
tx = graph.begin()
a = Node(label='hero',name='Sabri')
tx.create(a)
tx.commit()
过时的驱动程序 py2neo v3.1.2 与 Neo4j v3.4
如本 Github 问题报告所述 https://github.com/neo4j/neo4j-python-driver/issues/252 报告该问题的用户正在使用 py2neo 3.1.2 和 Neo4jv3.4。怀疑是由于 py2neo 3.1.2 附带的过时驱动程序 (v1.1)。 Neo4j v3.4 的新发行版似乎附带了新的驱动程序 1.6。
将 py2neo 升级到 v4.0 并坚持使用最新版本的 Neo4j 服务器,即 v3.4
执行此操作时我 运行 陷入另一个错误
File "/Users/sjamal/.conda/envs/py2neo.v4/lib/python3.6/site-packages/py2neo/internal/http.py", line 26, in <module>
from neo4j.addressing import SocketAddress
ModuleNotFoundError: No module named 'neo4j.addressing'
在这个 Whosebug 线程 (ModuleNotFoundError: No module named 'neo4j.addressing' and ModuleNotFoundError: No module named 'neo4j') 中讨论了这个问题可能是驱动程序 1.6 驱动程序可能必须通过 pip 手动安装,我确实这样做了。
pip install neo4j-driver==1.6.2
我现在收到一个新错误,在调用地图对象时捕获了 TypeError。
File "/Users/sjamal/.conda/envs/py2neo.v4/lib/python3.6/site-packages/py2neo/internal/http.py", line 74, in fix_parameters
raise TypeError("Parameters of type {} are not supported".format(type(value).__name__))
TypeError:不支持类型映射的参数
我发现这个 github 问题 post 由 speters-cmri https://github.com/technige/py2neo/issues/688 which contained the following github commit (https://github.com/technige/py2neo/compare/v4...CMRI-ProCan:v4 编辑)通过修改 py2neo 包 [=18] 中的 json.py 脚本来解决问题=]
我再次 运行 我的脚本来添加一个测试节点并且它 运行 没有任何问题。
如果您太懒或太沮丧而无法阅读冗长的解释,这里有一个摘要
1. Make sure neo4j v3.0+ is installed. I suggest you look into docker to install neo4j using a docker image
2. pip install py2neo==v4.0
3. pip install neo4j-driver==1.6.2
4. Modify json.py file as described here https://github.com/technige/py2neo/compare/v4...CMRI-ProCan:v4
5. Run py2neo script outlined above
我在将 Neomodel 和 py2neo 客户端与 Neo4j 一起使用时遇到了一些问题。我在单独的 anaconda 虚拟环境中安装了 Neomodel 和 py2neo 并分别进行了测试。 Neo4j 是 installed/docked 使用 docker.
新模型
代码
from neomodel import (config, StructuredNode, StringProperty, IntegerProperty,UniqueIdProperty, RelationshipTo, RelationshipFrom)
config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687'
class Country(StructuredNode):
code = StringProperty(unique_index=True, required=True)
# traverse incoming IS_FROM relation, inflate to Person objects
inhabitant = RelationshipFrom('Person', 'IS_FROM')
class Person(StructuredNode):
uid = UniqueIdProperty()
name = StringProperty(unique_index=True)
age = IntegerProperty(index=True, default=0)
# traverse outgoing IS_FROM relations, inflate to Country objects
country = RelationshipTo(Country, 'IS_FROM')
jim = Person(name='Jim', age=3).save()
jim.age = 4
jim.save() # validation happens here
jim.delete()
jim.refresh() # reload properties from neo
jim.id # neo4j internal id
虽然 Neomodel 生成了在 neo4j webapp 上查看的节点。创建的节点是年龄为 3 的吉姆,即它似乎没有记录吉姆年龄从 3 变为 4 的事实。另外,我假设 jim.delete() 会删除它所做的节点都不是。最后,它提示以下错误(下面是错误最后几行的片段)。
错误
...
File "/Users/sjamal/.conda/envs/tneo/lib/python3.6/site-
packages/neomodel/core.py", line 452, in inflate
if db_property in node.properties:
AttributeError: 'Node' object has no attribute 'properties'
现在我确实找到了这个 post,其中用户 "Jack Daniel" 提到 neomodel 不支持 neo4j 3。所以我尝试对接 Neo4j v.2.3 图像,但随后收到以下错误(请注意,它是错误最后几行的片段)
对接图像Neo4j 2.3时出错
File "/Users/sjamal/.conda/envs/tneo/lib/python3.6/ssl.py", line 817, in __init__
self.do_handshake()
File "/Users/sjamal/.conda/envs/tneo/lib/python3.6/ssl.py", line 1077, in do_handshake
self._sslobj.do_handshake()
File "/Users/sjamal/.conda/envs/tneo/lib/python3.6/ssl.py", line 689, in do_handshake
self._sslobj.do_handshake()
OSError: [Errno 0] Error
Py2neo
由于我在使用 Neomodel 时遇到的问题,我开始考虑使用 p2neo,但我似乎无法正确配置。
代码
from py2neo import Node, Relationship, Graph
graph = Graph("localhost", user='neo4j', password='password', bolt=None)
alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
alice_knows_bob = Relationship(alice, "KNOWS", bob)
graph.create(alice_knows_bob)
错误
File "/Users/sjamal/.conda/envs/py2neo_test/lib/python3.6/site-packages/neo4j/bolt/connection.py", line 459, in acquire
connection = self.connector(address)
File "/Users/sjamal/.conda/envs/py2neo_test/lib/python3.6/site-packages/neo4j/v1/bolt.py", line 46, in <lambda>
pool = ConnectionPool(lambda a: connect(a, security_plan.ssl_context, **config))
File "/Users/sjamal/.conda/envs/py2neo_test/lib/python3.6/site-packages/neo4j/bolt/connection.py", line 601, in connect
raise ProtocolError("Connection to %r closed without handshake response" % (address,))
neo4j.bolt.connection.ProtocolError: Connection to ('localhost', 7687) closed without handshake response
感谢所有对此进行调查的人。我很乐意收到有关如何设置 Py2neo 的任何建议或解释,无论我是否让 Neomodel 工作。
所以我设法解决了 Py2neo 的问题,但没有解决 Neomodel 的问题。如果我确实找到了让 Neomodel 工作的方法,我将 post 它和 link 到此 post 或 post 作为此线程中的评论。
py2neo v4.0 和 neo4j 的 Py2neo 解决方案 v3.o
我尝试了各种组合,从 neo4j 2.3 开始,结合不同版本的 py2neo,例如 3.1.2,然后对 neo4j v3.0 进行了同样的组合。
我正在 post 编写我用来创建节点和图形连接的脚本,因为当我试图弄清楚是我的配置设置不当还是包、驱动程序等
Py2neo 脚本
from py2neo import Node, Relationship, Graph
graph = Graph('http://localhost:7474/db/data',user='neo4j',pass word='password1234')
tx = graph.begin()
a = Node(label='hero',name='Sabri')
tx.create(a)
tx.commit()
过时的驱动程序 py2neo v3.1.2 与 Neo4j v3.4
如本 Github 问题报告所述 https://github.com/neo4j/neo4j-python-driver/issues/252 报告该问题的用户正在使用 py2neo 3.1.2 和 Neo4jv3.4。怀疑是由于 py2neo 3.1.2 附带的过时驱动程序 (v1.1)。 Neo4j v3.4 的新发行版似乎附带了新的驱动程序 1.6。
将 py2neo 升级到 v4.0 并坚持使用最新版本的 Neo4j 服务器,即 v3.4
执行此操作时我 运行 陷入另一个错误
File "/Users/sjamal/.conda/envs/py2neo.v4/lib/python3.6/site-packages/py2neo/internal/http.py", line 26, in <module>
from neo4j.addressing import SocketAddress
ModuleNotFoundError: No module named 'neo4j.addressing'
在这个 Whosebug 线程 (ModuleNotFoundError: No module named 'neo4j.addressing' and ModuleNotFoundError: No module named 'neo4j') 中讨论了这个问题可能是驱动程序 1.6 驱动程序可能必须通过 pip 手动安装,我确实这样做了。
pip install neo4j-driver==1.6.2
我现在收到一个新错误,在调用地图对象时捕获了 TypeError。
File "/Users/sjamal/.conda/envs/py2neo.v4/lib/python3.6/site-packages/py2neo/internal/http.py", line 74, in fix_parameters
raise TypeError("Parameters of type {} are not supported".format(type(value).__name__))
TypeError:不支持类型映射的参数
我发现这个 github 问题 post 由 speters-cmri https://github.com/technige/py2neo/issues/688 which contained the following github commit (https://github.com/technige/py2neo/compare/v4...CMRI-ProCan:v4 编辑)通过修改 py2neo 包 [=18] 中的 json.py 脚本来解决问题=]
我再次 运行 我的脚本来添加一个测试节点并且它 运行 没有任何问题。
如果您太懒或太沮丧而无法阅读冗长的解释,这里有一个摘要
1. Make sure neo4j v3.0+ is installed. I suggest you look into docker to install neo4j using a docker image
2. pip install py2neo==v4.0
3. pip install neo4j-driver==1.6.2
4. Modify json.py file as described here https://github.com/technige/py2neo/compare/v4...CMRI-ProCan:v4
5. Run py2neo script outlined above