Надежная (автоматическая)увеличение идентификаторов для всех узлов/отношений в СУБД 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 2

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 в вашем приложении.