Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4J Cypher:确保约束存在(如果已经存在,则避免错误)_Neo4j_Cypher - Fatal编程技术网

Neo4J Cypher:确保约束存在(如果已经存在,则避免错误)

Neo4J Cypher:确保约束存在(如果已经存在,则避免错误),neo4j,cypher,Neo4j,Cypher,在应用程序启动时,我希望确保标记和约束存在 当我在应用程序启动时调用以下命令时,我收到一个错误,因为约束已经存在: CREATE CONSTRAINT ON (node:MyLabel) ASSERT node.myProperty IS UNIQUE 我希望确保约束存在而不会抛出错误 在Cypher有没有办法做到这一点?我很难在Neo4J文档中找到任何帮助。您可以使用APOC模式断言过程来创建索引和约束。结果将是indexLabel和constraintLabel集合中指定的索引/约束的净集

在应用程序启动时,我希望确保标记和约束存在

当我在应用程序启动时调用以下命令时,我收到一个错误,因为约束已经存在:

CREATE CONSTRAINT ON (node:MyLabel) ASSERT node.myProperty IS UNIQUE
我希望确保约束存在而不会抛出错误


在Cypher有没有办法做到这一点?我很难在Neo4J文档中找到任何帮助。

您可以使用APOC模式断言过程来创建索引和约束。结果将是
indexLabel
constraintLabel
集合中指定的索引/约束的净集合

CALL apoc.schema.assert({},{MyLabel:['myProperty']}) 
yield label, key, unique, action
RETURN *

不幸的是,在Cypher中没有很好的支持,甚至APOC产品在这里也不适合,因为删除非断言索引和约束会产生副作用

您必须对
call db.constraints()
call db.indexes()
的结果进行字符串分析

更新

在最新版本的Neo4j中(不确定这是在什么时候更改的),如果试图应用已经存在的约束,它不应该抛出任何错误


此外,APOC的较新版本有一个新的
dropExisting
参数,允许您在应用新索引/约束之前控制是否删除或保留现有架构。

如果不存在,可以使用,例如:如果不存在,则创建约束(节点:MyLabel)ASSERT node.myProperty是唯一的

感谢Dave的建议-目前我正在寻找一个更简单的解决方案,它不需要在我使用的Neo4J实例中添加额外的插件。我将不情愿地将我的CREATE CONSTRAINT语句包围在try catch块中。请小心使用此语句,因为我记得
apoc.schema.assert()
会删除所有未断言的约束/索引。同意。第一次运行时,我删除了所有未附加的约束。如果它有一个“测试”模式就好了。在3.5版本中,它没有抛出错误,但在4.0版本中,它再次抛出错误。你知道如何在4.0中正确地实现它吗?这是一个疏忽,我们曾计划将“如果不存在”作为一个选项,但这并没有在早期版本中实现。请参阅我们的文档以了解如何使用此功能。