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脚本中运行该字符串,运行它,并检查调用程序的返回代码。
我感谢两位评论员的努力,我不想让任何一位都悬着不放。