我想在我的數據庫中的所有節點上實現唯一的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)
。當然,這是行不通的,因爲它會在Ruby中調用gen_method
一次,然後將Neo4j的嘗試設置的所有節點ID,以那一個價值。
我現在在想,最好先在Ruby中生成大量的ID,然後將其包含在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
這有可能嗎?有沒有不同的方式來處理這將工作?