我无法捕获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";

10-07 15:06