Neo4j:如何调用;创建索引";除非不存在

Neo4j:如何调用;创建索引";除非不存在,neo4j,cypher,Neo4j,Cypher,CREATE INDEX命令不是幂等的,如果给定的索引已经存在,则会导致错误。我是neo4j新手,无法找到一个可以避免此错误的谓词。我尝试了各种各样的ANY(…),它们都在“db.indexes()”处呕吐 由于创建索引…在索引存在时失败,而删除索引…在索引不存在时失败,因此我不知道如何编写一个.cypher文件,仅在需要时创建索引 如果(c.someProperty)上的(c:SomeLabel)不存在,则短形式可能类似于为(c:SomeLabel)创建索引indexName,但当然该短形式不

CREATE INDEX
命令不是幂等的,如果给定的索引已经存在,则会导致错误。我是neo4j新手,无法找到一个可以避免此错误的谓词。我尝试了各种各样的
ANY(…)
,它们都在“db.indexes()”处呕吐

由于
创建索引…
在索引存在时失败,而
删除索引…
在索引不存在时失败,因此我不知道如何编写一个.cypher文件,仅在需要时创建索引

如果(c.someProperty)上的(c:SomeLabel)不存在,则短形式可能类似于
为(c:SomeLabel)创建索引indexName,但当然该短形式不存在


对于谓词、子查询或类似的表达式,是否有某种方法可以做到这一点?

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

CREATE (n:Car {id: 1});
添加1个标签,创建1个节点,设置1个属性,23毫秒后完成

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

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

在创建索引之前,可以使用该函数检查索引是否存在

例如,如果
: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 planner当前无法解析上述
WHERE
子句之后的正常
CREATE INDEX\u name…
语法,因此此查询使用该过程


还有一个功能更强大的APOC程序,但对于您的要求来说,它可能有些过分。

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

mbh86答案的第一行是不准确的,至少在我的系统中是这样。该命令不会被忽略,它会失败并出现错误。因此,如果在同一个密码脚本中还有其他内容,它将失败

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


我感谢两位评论员的努力,我不想让两位都挂断。

从Neo4j 4.1.3开始,引入了一种新的索引创建语法来实现这一点


如果(t.id)上的(t:Test)不存在,则创建索引myIndex

第二次和后续尝试失败,我看到了相同的抱怨:cypher shell-u neo4j-p neo4j“在:Car(id)上创建索引”一个等效索引已经存在,'INDEX(7,'INDEX_1b145ec8',GENERAL BTREE,:Car(id),native-BTREE-1.0)’。在Neo4j的4.0版本之前,如果索引已经存在,则实际上忽略了create index命令。随着Neo4j 4.0的引入,这种行为发生了变化。在3.5中,如果您创建的索引已经存在,则驱动程序会抛出一个错误。但浏览器没有。奇怪的区别。我的neo浏览器抱怨“apoc.schema.node.indexists”在WHERE子句中是一个未知函数。apoc插件是什么?呵呵。插件?什么插件?我试试看会发生什么。我已经能够通过“CALL db.indexes()YIELD name”获得索引名列表,但我不知道如何在Cypher中的作用域中获得结果。我发现在文档中很难找到像这样的具体信息。对不起,这不会发生。我在运行CentOS7的无头来宾虚拟机中运行neo4j,托管在Windows10Pro系统上。我看不到任何迹象表明安装在Windows上的“Neo4j桌面”将连接到VM上运行的服务器。安装脚本想把东西放在Windows文件系统中,而Windows文件系统根本没有安装neo4j。我看不到从命令行安装apoc的方法,也看不到从Neo浏览器安装apoc的能力。安装apoc不需要Neo4j桌面,您可以手动下载一个版本并将其粘贴到
$Neo4j_HOME/plugins
文件夹中。您还需要告诉Neo4j您相信该插件可以在过程沙箱之外运行,比如将
dbms.security.procedures.unrestricted=apoc.*
添加到
Neo4j.conf
。您的Neo4j版本是什么?你能分享你正在执行的代码吗?太糟糕了,我不能粘贴屏幕分享。我正在运行“Neo4j服务器版本:4.0.0(社区)。我将您发布的代码粘贴到Neo浏览器的输入框中。我通过从bash命令行运行以下命令得到了相同的结果:“cypher shell-u Neo4j-p Neo4j”在:Car(id)上创建索引“'是否有可能在某个地方有一个配置选项导致Neo4j默默地忽略这样的错误?我敢肯定,当我从python驱动程序调用这些时,它会引发一个异常,然后我可以捕获并处理该异常。我看到cypher shell确实失败了,返回代码为-1,所以也许这就是答案。
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