我已经使用Docker设置了Neo4j数据库。我使用所有默认配置的3.4.1企业版。
我在节点上添加了唯一约束。
CONSTRAINT ON (product:Product) ASSERT product.pcode IS UNIQUE
然后我尝试运行MERGE
查询
MERGE (u:Profile{pid:'123'})<-[:SHOPS_AT]-(:Store)-[:SELLS]->(:Product{pcode:'pcode-1234'})
但是,出现以下错误:
Neo.DatabaseError.Statement.ExecutionFailed: Found no access plan for a pattern relationship in a connected component. This must not happen.
您可以看到,异常消息根本没有帮助。我注意到,如果删除约束,它将起作用。
我尝试了在具有相同约束的VM中部署的另一个Neo4j实例,它具有相同的约束,并且可以通过!
有人有类似经历吗?谷歌搜索并没有太多帮助。为什么会出现此错误?
答案 0 :(得分:0)
您应该为此错误行为创建一个neo4j issue。
但是,即使该bug不存在,您也可能不想以这种方式编写查询。引用documentation for MERGE(摘自版本3.5):
在完整模式下使用
for x in r.json(): print(x)
时,其行为是 整个模式匹配,或创建整个模式。MERGE
不会 部分使用现有模式-all全部或全无。如果不完整 需要匹配,这可以通过拆分模式来完成 分成多个MERGE
子句。
即此查询:
MERGE
可以创建新的MERGE (u:Profile{pid:'123'})<-[:SHOPS_AT]-(:Store)-[:SELLS]->(:Product{pcode:'pcode-1234'})
和Profile
节点-即使其中一个节点与现有节点匹配-如果整个模式不存在。
您实际上可能想使用以下查询(它也不会引起您遇到的错误):
Product