Neo4j:如何仅在不存在时才调用"CREATE INDEX"



CREATE INDEX <indexName>命令不是幂等的,如果给定的索引已经存在,则会导致错误。我是neo4j的新手,找不到可以避免此错误的谓词。我尝试过ANY(...)的各种排列,它们都在"db.indexes(("中出现。

由于CREATE INDEX ...在索引存在的情况下失败,而DROP INDEX ...在不存在索引的情况下则失败,因此我不知道如何编写一个.cypher文件,该文件仅在需要时创建索引。

短形式可能类似于CREATE INDEX indexName FOR (c:SomeLabel) ON (c.someProperty) IF NOT EXISTS,但这种短形式当然不存在。

有没有什么方法可以用谓词、子查询或类似的表达式来实现这一点?

从Neo4j 4.1.3开始,引入了一种新的索引创建语法来完成

CREATE INDEX myIndex IF NOT EXISTS FOR (t:Test) ON (t.id)

搜索性能索引

您可以在创建索引之前使用apoc.schema.node.indexExists函数来检查索引是否存在。

例如,如果:Foo(id)索引不存在,则此查询将创建该索引:

WITH 1 AS ignored
WHERE NOT apoc.schema.node.indexExists('Foo', ['id'])
CALL db.createIndex('index_name', ['Foo'], ['id'], 'native-btree-1.0') YIELD name, labels, properties
RETURN name, labels, properties

由于某些原因,Cypher计划器目前无法在上述WHERE子句之后解析正常的CREATE INDEX index_name ...语法,因此此查询使用db.createIndex过程。

还有一个更强大的APOC过程,APOC.schema.assert,但对于您的需求来说,它可能有些过头了。

默认情况下,如果存在索引,则会忽略该命令。你能测试以下内容吗?

CREATE (n:Car {id: 1});

添加了1个标签,创建了1个节点,设置了1个属性,在23毫秒后完成。

CREATE INDEX ON :Car (id);

第一次执行:添加了1个索引,在6毫秒后完成。

第二次执行:(无更改,无记录(

我尝试了这两个建议,但都没有解决我的问题。我没有时间通过反复试验来发现如何在我的环境中安装APOC。

mbh86答案的第一行是不准确的,至少在我的系统中是这样。该命令不会被忽略,它会因错误而失败。所以,如果其他任何东西都在同一个密码脚本中,它就会失败。

我能做的最好的事情显然是将CREATE INDEX封装在命令行字符串中,从bash或python脚本中运行该字符串,运行它,并检查调用程序的返回代码。

我感谢两位评论员的努力,我不想让任何一位都悬着不放。

最新更新