Свойство Auto increment в Neo4j

Насколько я понимаю, идентификаторы, заданные Neo4j (ID(node)), нестабильны и ведут себя как номера строк в SQL. Поскольку идентификаторы в основном используются для отношений в SQL, и они легко смоделированы в Neo4j, для идентификаторов, похоже, не так много, но тогда как вы решаете поиск определенных узлов? Наличие REST API, который должен иметь уникальные маршруты для каждого node (например, /api/concept/23), кажется довольно стандартным для веб-приложений. Но, несмотря на то, что он был настолько фундаментальным, единственный жизнеспособный способ, который я нашел, был либо через

  • языковые рамки
  • как несвязанный node, который поддерживает приращения:
// 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 Person node
CREATE (p:Person{id:uid,firstName:'Gabriel',lastName:'Smith'})
RETURN p AS person

Источник: http://www.neo4j.org/graphgist?8012859

Действительно ли нет более простого способа, а если нет, есть ли для этого конкретная причина? Является ли мой подход анти-шаблоном в контексте Neo4j?

Ответ 1

Внутренние идентификаторы Neo4j немного более стабильны, чем идентификатор строки sql, поскольку они никогда не будут меняться во время транзакции, например.

И действительно, разоблачение их для внешнего использования не рекомендуется. Я знаю, что в Neo есть некоторые намерения реализовать такую ​​функцию.

В основном люди склонны использовать для этого два решения:

  • Использование генератора UUID на уровне приложения, например PHP: https://packagist.org/packages/rhumsaa/uuid и добавление уникального ограничения label/uuid для всех узлов.

  • Использование очень маленького плагина Neo4j, такого как https://github.com/graphaware/neo4j-uuid, который будет добавлять свойства uuid на лету, поэтому он избавит вас от необходимости обрабатывать его на уровня приложения и проще управлять состоянием сохранения ваших объектов node