在Neo4j上使用python包(Neomodel和py2neo)的问题

时间:2019-03-02 19:58:54

标签: neo4j py2neo neomodel

在Neo4j上使用Neomodel和py2neo客户端时,我遇到了一些问题。我已经在单独的anaconda虚拟环境中安装了Neomodel和py2neo,并分别进行了测试。 Neo4j是使用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 Web应用程序上查看的节点。创建的节点是Jim,年龄为3,即似乎没有记录Jims的年龄从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'

现在,我确实找到了该帖子,其中用户“ Jack Daniel”提到neomodel不支持neo4j3。因此,我尝试对接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

感谢任何对此进行调查的人。无论我是否要使Neomodel正常工作,我都会很高兴收到关于如何设置Py2neo的任何建议或解释。

1 个答案:

答案 0 :(得分:0)

所以我设法解决了与Py2neo有关的问题,但没有解决与Neomodel有关的问题。如果我确实找到使Neomodel正常工作的方法,则将其发布并链接到此帖子,或在此主题中作为评论发布。

带有py2neo v4.0和neo4j v3.o的Py2neo解决方案

我尝试了各种组合,从neo4j 2.3以及py2neo的不同版本(例如3.1.2)开始,然后在neo4j v3.0中进行了相同的操作。

我正在发布我用来创建节点和图形连接的脚本,当时我想弄清楚配置设置是否不正确,或者程序包,驱动程序等是否存在错误,这让我很生气。

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'

在此stackoverflow线程(ModuleNotFoundError: No module named 'neo4j.addressing' and ModuleNotFoundError: No module named 'neo4j')中讨论过,问题可能是可能必须通过pip手动安装驱动程序1.6驱动程序。

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:不支持映射类型的参数

我发现了由speters-cmri https://github.com/technige/py2neo/issues/688发布的这个github问题,其中包含以下github提交(https://github.com/technige/py2neo/compare/v4...CMRI-ProCan:v4),可以通过修改py2neo包中的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