Neo.DatabaseError.Statement.ExecutionFailed:在已连接的组件中找不到模式关系的访问计划。这一定不能发生

时间:2019-02-28 15:22:07

标签: neo4j cypher

我已经使用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实例,它具有相同的约束,并且可以通过!

有人有类似经历吗?谷歌搜索并没有太多帮助。为什么会出现此错误?

1 个答案:

答案 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