У меня есть база данных neo4j с узлами, которые имеют метки «Программа» и «Сессия». В базе данных Neo4j я применял ограничение уникальности свойств: «name» и «href». От: схемаpy2neo не применяет ограничения уникальности в базе данных Neo4j
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'
Моя мысль в том, что если я пытаюсь добавить узлы и они 're уже в базе данных они просто не будут добавлены.
Я сделал блок try/except AttributeError вокруг строк creation/add_labels, но когда я это сделал, мне удалось дублировать все, что было уже в базе данных, хотя у меня были указанные ограничения. (?!?) (Как может py2neo нарушить эти ограничения?)
Я действительно смущен и буду признателен за любую помощь в определении того, как добавлять узлы только тогда, когда они еще не существуют.
Ограничение не будет нарушено, пока вы не добавите метку, которую вы делаете после создания узла. Таким образом, узел создается, но add_label должен завершиться неудачей. –
Я думаю, что другой вопрос: могу ли я добавить ограничения, не привязанные к ярлыкам? (Я предполагаю, что не могу.) –
Можете ли вы сделать это в одном заявлении? graph.create (узел) .add_label()? –