捕获Neo4j异常

2024-06-25 22:42:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我抓不到ConstraintError异常。在

当我运行这个:

try:
    tx.run('MERGE (:Person {{name:"{name}",country:"{country}"}})'.format(name=name,country=country))
except ConstraintViolation:
    pass

例外情况仍然存在。在

我试过了

^{pr2}$

也限制了恐怖和暴力。在

但是,无论我试图捕捉ConstraintError还是ConstraintViolation,我都会得到以下错误:

ConstraintError: Node(5314) already exists with label `Person` and property `name` = 'SomeThing'

我该怎么处理?在


Tags: runnameformatpassmergecountryperson例外情况
2条回答

假设这个节点已经存在(为了清楚起见,我使用字符串文字而不是参数):

(:Person {name: "SomeThing", country: "Canada"})

你提出这个要求:

^{pr2}$

您将得到一个ConstraintError,因为这样的节点还不存在(具有两个属性值),但您也无法创建该节点(因为唯一性约束)。在

可能的修复方法

  • 如果您想强制country值为“USA”,不管怎样,这都应该避免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";
    

我遇到了同样的问题,并发现异常没有被命中的原因是neo4j驱动程序在会话关闭之前不会引发异常。在

上面的代码中没有,但我假设您以前打开了一个session—类似于

session = driver.session()

如果你移动会话.关闭进入try块,然后您应该命中异常

^{pr2}$

相关问题 更多 >