我无法捕获ConstraintError异常。
当我运行这个:
try:
tx.run('MERGE (:Person {{name:"{name}",country:"{country}"}})'.format(name=name,country=country))
except ConstraintViolation:
pass
异常仍然存在。
我试过了
from neo4j.v1 import exceptions
以及ConstraintError和ConstraintViolation。
但是,如果我尝试捕获ConstraintError或ConstraintViolation,则会收到此错误:
ConstraintError: Node(5314) already exists with label `Person` and property `name` = 'SomeThing'
我该如何正确处理?
最佳答案
假设此节点已经存在(为清楚起见,我使用字符串文字而不是参数):
(:Person {name: "SomeThing", country: "Canada"})
然后您发出以下请求:
MERGE (:Person {name: "SomeThing", country: "USA"})
您将得到一个
ConstraintError
,因为这样的节点尚不存在(具有两个属性值),但是您也无法创建该节点(由于唯一性约束)。可能的修复
如果要强制将
country
值设置为“美国”,则无论如何,都应避免使用ConstraintError
:MERGE (p:Person {name: "SomeThing"})
SET p.country = "USA";
或者,如果仅想在
country
值的节点尚不存在的情况下设置name
值,则该方法应该有效:MERGE (p:Person {name: "SomeThing"})
ON CREATE SET p.country = "USA";
或者,如果仅想设置
country
值(如果已存在具有该name
值的节点),则此方法应该起作用:MERGE (p:Person {name: "SomeThing"})
ON MATCH SET p.country = "USA";