【问题标题】:Py2neo (V4) - AttributeError: 'Graph' object has no attribute 'find_one'Py2neo (V4) - AttributeError: 'Graph' 对象没有属性 'find_one'
【发布时间】:2019-02-02 23:27:08
【问题描述】:

我正在尝试将 neo4j-flask 应用程序更新到 Py2Neo V4,但我找不到“find_one”功能是如何被替换的。 (妮可·怀特使用 Py2Neo V2)

我的设置:

  • Ubuntu 18.04
  • Python 3.6.5
  • Neo4j 服务器版本:3.4.6(社区)

Requirements.txt(其余代码来自 Nicole White 的 github 存储库):

atomicwrites==1.2.0
attrs==18.1.0
backcall==0.1.0
bcrypt==3.1.4
certifi==2018.8.24
cffi==1.11.5
click==6.7
colorama==0.3.9
decorator==4.3.0
Flask==1.0.2
ipykernel==4.8.2
ipython==6.5.0
ipython-genutils==0.2.0
itsdangerous==0.24
jedi==0.12.1
Jinja2==2.10
jupyter-client==5.2.3
jupyter-console==5.2.0
jupyter-core==4.4.0
MarkupSafe==1.0
more-itertools==4.3.0
neo4j-driver==1.6.1
neotime==1.0.0
parso==0.3.1
passlib==1.7.1
pexpect==4.6.0
pickleshare==0.7.4
pkg-resources==0.0.0
pluggy==0.7.1
prompt-toolkit==1.0.15
ptyprocess==0.6.0
py==1.6.0
py2neo==4.1.0
pycparser==2.18
Pygments==2.2.0
pytest==3.7.3
python-dateutil==2.7.3
pytz==2018.5
pyzmq==17.1.2
simplegeneric==0.8.1
six==1.11.0
tornado==5.1
traitlets==4.3.2
urllib3==1.22
wcwidth==0.1.7
Werkzeug==0.14.1

注册用户时收到的错误:

AttributeError: 'Graph' 对象没有属性 'find_one'

"User.find()方法使用py2neo的Graph.find_one()方法查找 数据库中带有标签的节点:用户和给定的用户名, 返回一个 py2neo.Node 对象。 "

在 Py2Neo V3 中,函数 find_one -> https://py2neo.org/v3/database.html?highlight=find#py2neo.database.Graph.find_one 可用。

在 Py2Neo V4 https://py2neo.org/v4/matching.html 中不再有查找功能。

有人知道如何在 V4 中解决它,或者正在降级?

【问题讨论】:

    标签: python flask neo4j py2neo


    【解决方案1】:

    py2neo v4 有一个first 函数,可以与NodeMatcher 一起使用。见:https://py2neo.org/v4/matching.html#py2neo.matching.NodeMatch.first

    也就是说……v4 引入了 GraphObjects(至少到目前为止)我发现它非常简洁。

    在链接的 github 示例中,用户是通过以下方式创建的:

    user = Node('User', username=self.username, password=bcrypt.encrypt(password))
    graph.create(user)
    

    找到
    user = graph.find_one('User', 'username', self.username)
    

    在 py2neo v4 中我会这样做

    class User(GraphObject):
        __primarykey__ = "username"
    
        username = Property()
        password = Property()
    
     lukas = User()
     lukas.username = "lukasott"
     lukas.password = bcrypt.encrypt('somepassword')
     graph.push(lukas)
    

    user = User.match(graph, "lukasott").first()
    

    据我了解,first 函数提供与 find_one 相同的保证,正如 v3 文档中所引用的那样,“如果找到多个匹配节点,则不会失败。”

    【讨论】:

    • 我的开放点是:class User(GraphObject): NameError: name 'GraphObject' is not defined -> 认为我可以从 py2neo import GraphObject
    • 好的解决方法:from py2neo.ogm import GraphObject, Property, Label
    【解决方案2】:

    answer above 的基础上,这是一个使用self.match().first() 而不是find_one() 的最小示例。 使用Property() 设置属性以提供对底层节点属性的访问器。 (此处的文档:https://py2neo.org/v4/ogm.html#py2neo.ogm.Property

    from py2neo import Graph, Node
    from passlib.hash import bcrypt
    
    from py2neo.ogm import GraphObject, Property
    
    graph = Graph()
    
    
    class User(GraphObject):
        __primarykey__ = 'username'
    
        username = Property()
        password = Property()
    
        def __init__(self, username):
            self.username = username
    
        def find(self):
            user = self.match(graph, self.username).first()
            return user
    
        def register(self, password):
            if not self.find():
                user = Node('User', username=self.username, password=bcrypt.encrypt(password))
                graph.create(user)
                return True
            else:
                return False
    

    【讨论】:

      【解决方案3】:

      这对我有用。参考下面的链接

      def find(self):
              user = graph.nodes.match("User", self.username).first()
              return user
      

      https://py2neo.org/v5/_modules/py2neo/database.html

      【讨论】:

      • 是的,感谢 V5 的更新,他们改进了很多 :-)
      【解决方案4】:

      解决此问题的另一种更简单的方法是将find_one 替换为以下内容:

      from py2neo import Graph, NodeMatcher
      matcher = NodeMatcher(graph)
      
      user = matcher.match('user', name='name').first()
      

      【讨论】:

      • 所以这是 v3 语法的替代品:user = graph.find_one("user", "name", "John") 谢谢!完美运行!
      猜你喜欢
      • 1970-01-01
      • 2012-12-01
      • 2021-04-19
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多