Надежная (автоматическая)увеличение идентификаторов для всех узлов/отношений в СУБД Neo4j
Я ищу способ генерировать уникальные идентификаторы для всех моих узлов / отношений в Neo4j, основываясь на приращении счетчика (не больших длинных UUID).
Внутренние идентификаторы, поддерживаемые двигателем Neo4j, как известно, не являются надежными в качестве внешних ссылок.
Наиболее близким решением являетсякод, предложенный в этом вопросе , но он не работает, когда одно предложение CREATE
создает несколько новых узлов:
// get unique id
MERGE (id:UniqueId{name:'Person'})
ON CREATE SET id.count = 1
ON MATCH SET id.count = id.count + 1
WITH id.count AS uid
// create a new node attached to every existing :something node
MATCH (n:something)
CREATE (:somethingRelated {id:uid}) -[:rel]-> (n)
Когда существует несколько (n:something)
, каждый новый созданный (:somethingRelated)
будет иметь один и тот же идентификатор. Есть ли какой-то способ обойти это, используя только шифр?
2 ответа:
Попробуйте выделить блок идентификаторов:
// collect nodes to connect MATCH (n:Crew) WITH collect(n) AS nodes MERGE (id:UniqueId { name:'Person' }) // reserve id-range SET id.count = coalesce(id.count,0)+ size(nodes) WITH nodes, id.count - size(nodes) AS base // for each index UNWIND range(0,size(nodes)-1) AS idx // get node, compute id WITH nodes[idx] AS n, base +idx AS id CREATE (:SomethingRelated { uid:id })-[:rel]->(n)
С моей точки зрения, это невозможно сделать в шифре.
Я предлагаю вам написать расширение Java для этого, потому что ваш подход с Cypher не будет работать в параллельной среде. Вы не в состоянии обеспечить уникальность.
Не могли бы вы рассказать нам больше о вашем случае использования и почему вы не используете UUID? - https://github.com/graphaware/neo4j-uuid
Основываясь на вашем комментарии ниже, я предлагаю создать ID в вашем приложении.