Neo4j: как вызвать «CREATE INDEX», только если не существует - PullRequest
2 голосов
/ 01 апреля 2020

Команда CREATE INDEX <indexName> не идемпотентна и вызовет ошибку, если данный индекс уже существует. Я новичок в neo4j и не могу найти предикат, который позволяет избежать этой ошибки. Я пробовал различные перестановки ANY(...), и все они пребывают в "db.indexes ()".

Так как CREATE INDEX ... терпит неудачу, если индекс существует, и DROP INDEX ... терпит неудачу, если его нет, Я не знаю, как написать файл .cypher, который создает индекс только в случае необходимости.

Краткая форма может быть похожа на CREATE INDEX indexName FOR (c:SomeLabel) ON (c.someProperty) IF NOT EXISTS, но, конечно, такой краткой формы не существует.

Есть ли какой-нибудь способ сделать это с помощью предиката, подзапроса или какого-либо такого выражения?

Ответы [ 3 ]

0 голосов
/ 01 апреля 2020

Вы можете использовать функцию apo c .schema.node.indexExists , чтобы проверить, существует ли индекс перед его созданием.

Например, этот запрос создаст :Foo(id) index, если он еще не существует:

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 в настоящее время не может проанализировать нормальный синтаксис CREATE INDEX index_name ... после указанного выше предложения WHERE, поэтому в этом запросе используется Вместо этого используется процедура db.createIndex .

Существует также более мощная процедура APO C, apo c .schema.assert , но она может быть Избыточность для ваших требований.

0 голосов
/ 08 апреля 2020

Я попробовал оба предложения, и ни одно из них не решило мою проблему. У меня нет времени, методом проб и ошибок, узнать, как установить APO C в моей среде.

Первая строка ответа mbh86 является неточной, по крайней мере, в моей системе. Команда не игнорируется, она завершается с ошибкой. Поэтому, если что-то еще находится в том же самом шифровальном скрипте, оно не будет выполнено.

Лучшее, что я могу сделать, это, очевидно, заключить CREATE INDEX в строку командной строки, запустить эту строку из bash или python скрипт, запустите его и проверьте код возврата из вызывающей программы.

Я ценю усилия обоих комментаторов, и я не хотел оставлять ни один из них.

0 голосов
/ 01 апреля 2020

По умолчанию команда игнорируется, если индекс существует. Можете ли вы проверить следующее?

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

Добавлена ​​1 метка, создан 1 узел, задано 1 свойство, выполнено через 23 мс.

CREATE INDEX ON :Car (id);

1-е выполнение: Добавлен 1 индекс, завершено через 6 мс.

2-е выполнение: (без изменений, без записей)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...