赶上Neo4j例外

时间:2017-07-24 09:42:52

标签: python exception neo4j

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

我该如何妥善处理?

2 个答案:

答案 0 :(得分:3)

假设此节点已存在(为清晰起见,我使用字符串文字而不是参数):

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

并提出此请求:

MERGE (:Person {name: "SomeThing", country: "USA"})

你会得到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";
    

答案 1 :(得分:2)

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

这不在上面的代码中,但我认为你之前已经开了一个会议 - 比如

session = driver.session()

如果你将session.close移动到try块中,那么你应该点击异常

session = driver.session()

session.run("MATCH (n) DETACH DELETE n")
session.run("CREATE CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE")
try:
    session.run("CREATE (n:Person {name:'Bob'})")
    session.run("CREATE (n:Person {name:'Bob'})")
    session.close()
except:
    print("Error")