Я хочу реализовать уникальное свойство ID на всех узлах в моей базе данных, но вам необходимо применить его к существующим данным. Я использую Ruby для выполнения генерации IDS, а затем запускаю запрос Cypher. Я хочу избежать одного запроса, чтобы найти узлы, у которых отсутствует свойство, другое - установить свойство на каждом узле отдельно, поскольку для этого потребуется total_nodes + 1
запросов.Neo4j: присваивать уникальные значения всем узлам, соответствующим запросу
Первоначально я думал, что я мог бы сделать что-то вроде этого:
MATCH (n:`#{label}`) WHERE NOT HAS(n.my_id) SET n.my_id = '#{gen_method}' RETURN DISTINCT(true)
Конечно, это не будет работать, потому что он назвал бы gen_method
один раз в Руби, а затем Neo4j бы попытаться установить все узлы идентификаторы это одно значение.
Теперь я думаю, что было бы лучше всего создать большое количество идентификаторов в Ruby, а затем включить это в запрос Cypher. Я хотел бы пропустить согласованные узлы и установить недостающее свойство, равное его соответствующему индексу в массиве. Логика должна идти примерно так:
MATCH NODES WHERE GIVEN PROPERTY IS NULL, LIMIT TO 10,000
CREATE A COLLECTION OF THOSE NODES
SET NEW UUIDS ARRAY (provided by Ruby) AS "IDS_ARRAY"
FOR EACH NODE IN COLLECTION
SET GIVEN PROPERTY VALUE = CORRESPONDING INDEX POSITION IN "IDS_ARRAY"
RETURN COUNT OF NODES WHERE GIVEN PROPERTY IS NULL
На основании возвращаемого значения он знал бы, сколько еще раз для этого. У Cypher есть цикл foreach, но как я это делаю, особенно если мой массив unique_ids
начинается с строки в запросе Cypher?
unique_ids = ['first', 'second', 'third', 'etc']
i = 0
for node in matched_nodes
node.my_id_property = unique_ids[i]
i += 1
end
Возможно ли это? Есть ли другой способ справиться с этим, что будет работать?