我无法捕获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'
我该如何妥善处理?
答案 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")