gpt4 book ai didi

python - py2neo 不在 Neo4j 数据库中强制执行唯一性约束

转载 作者:太空宇宙 更新时间:2023-11-04 10:34:03 27 4
gpt4 key购买 nike

我有一个 neo4j 数据库,其中的节点带有标签“程序”和“ session ”。在 Neo4j 数据库中,我对属性实现了唯一性约束:“name”和“href”。来自 :schema

Constraints
ON (program:Program) ASSERT program.href IS UNIQUE
ON (program:Program) ASSERT program.name IS UNIQUE
ON (session:Session) ASSERT session.name IS UNIQUE
ON (session:Session) ASSERT session.href IS UNIQUE

我想定期查询另一个 API(因此将名称和 API 端点 href 存储为属性),并且只在数据库中不存在新节点时才添加它们。

这就是我创建节点的方式:

newprogram, = graph_db.create(node(name = programname, href = programhref))
newprogram.add_labels('Program')

newsession, = graph_db.create(node(name = sessionname, href = sessionhref))
newsession.add_labels('Session')

我遇到了以下错误:

Traceback (most recent call last):
File "/Users/jedc/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__
rv = self.handle_exception(request, response, e)
File "/Users/jedc/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__
rv = self.router.dispatch(request, response)
File "/Users/jedc/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
File "/Users/jedc/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__
return handler.dispatch()
File "/Users/jedc/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
File "/Users/jedc/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
File "/Users/jedc/appfolder/applicationapis.py", line 42, in post
newprogram.add_labels('Program')
File "/Users/jedc/appfolder/py2neo/util.py", line 99, in f_
return f(*args, **kwargs)
File "/Users/jedc/appfolder/py2neo/core.py", line 1638, in add_labels
if err.response.status_code == BAD_REQUEST and err.cause.exception == 'ConstraintViolationException':
AttributeError: 'ConstraintViolationException' object has no attribute 'exception'

我的想法是,如果我尝试添加节点,而它们已经在数据库中,它们将不会被添加。

我已经在 creation/add_labels 行周围做了一个 try/except AttributeError block ,但是当我这样做时,我设法复制了数据库中已有的所有内容,即使我已经显示了约束。 (?!?)(py2neo 如何设法违反这些约束??)

我真的很困惑,如果能帮助我弄清楚如何仅在节点不存在时添加节点,我将不胜感激。

最佳答案

问题似乎是您首先创建没有标签的节点,然后在创建后添加标签。

也就是

graph_db.create(node(name = programname, href = programhref))

graph_db.create(node(name = sessionname, href = sessionhref))

这首先创建没有任何标签的节点,这意味着节点满足约束条件,该条件仅适用于标签为ProgramSession 的节点。

一旦调用 newprogram.add_labels('Program')newsession.add_labels('Session') Neo4j 会尝试向节点添加标签并引发异常,因为无法满足约束断言。

Py2neo 可能正在创建重复的节点。虽然我敢肯定,如果您检查它们,您会发现一组节点有标签,而另一组节点没有。

你能以在创建的同时添加标签的方式使用 py2neo 吗?

否则你可以使用 Cypher 查询

CREATE (program:Program{name: {programname}, href: {programhref}})
CREATE (session:Session{name: {sessionname}, href: {sessionhref}})

使用 Py2neo,您应该能够按照 docs 中的建议执行此操作

graph_db = neo4j.GraphDatabaseService()
qs = '''CREATE (program:Program{name: {programname}, href: {programhref}})
CREATE (session:Session{name: {sessionname}, href: {sessionhref}})'''
query = neo4j.CypherQuery(graph_db, qs)
query.execute(programname=programname, programhref=programhref,
sessionname=sessionname, sessionhref=sessionhref)

关于python - py2neo 不在 Neo4j 数据库中强制执行唯一性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24632416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com