Py2neo(V4)-AttributeError:“图形”对象没有属性“ find_one”

时间:2018-08-28 10:46:03

标签: python flask neo4j py2neo

我正在尝试将neo4j-flask应用程序更新为Py2Neo V4,但是我找不到“ find_one”功能的替换方式。 (妮可·怀特(Nicole White)使用了Py2Neo V2) https://nicolewhite.github.io/neo4j-flask/

https://github.com/nicolewhite/neo4j-flask

https://neo4j.com/blog/building-python-web-application-using-flask-neo4j/

我的设置:

  • 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()方法在数据库中查找带有标签:User和给定用户名的节点,并返回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中解决该问题有想法,或者正在降级这种方法?

4 个答案:

答案 0 :(得分:2)

py2neo v4具有first可以使用的功能。参见:https://py2neo.org/v4/matching.html#py2neo.matching.NodeMatch.first

也就是说... v4引入了GraphObjects,至少到目前为止,我发现它很整洁。

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

NodeMatcher

并找到

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

在py2neo v4中,我将使用

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

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() 函数提供了与{3}文档中引用的first相同的保证,“并且如果找到多个匹配的节点,则不会失败。”

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

from py2neo import Graph, NodeMatcher
matcher = NodeMatcher(graph)

user = matcher.match('user', name='name').first()

答案 3 :(得分:1)

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