IDs
- это технический идентификатор для Neo4j, и их не следует использовать в качестве первичного ключа для вашего приложения.
Каждый узел (и взаимосвязь) имеет технический идентификатор, и он стабилен во времени.Но если вы удалите узел, например, узел 32
, Neo4j повторно использует этот ID
для нового узла.
Таким образом, вы можете использовать его в своих запросах внутри той же транзакции (проблем нет)), иначе вы должны знать, что вы делаете.
only способ получить техническую ID
, это использовать функцию ID
, как вы делаете в первом запросе:MATCH (n) WHERE ID(n) = 1234 RETURN n
.ID
не отображается как свойство узла, поэтому вы не можете сделать MATCH (n {ID:1234}) RETURN n
.
Вы заметили, что если вы хотите сделать WHERE
на строгомравенство, вы можете поставить условие непосредственно на узле.Например:
MATCH (n:Node) WHERE n.name = 'logisima' RETURN n
MATCH (n:Node {name:'logisima'}) RETURN n
Эти два запроса идентичны, они генерируют один и тот же план запроса, это всего лишь синтаксическийsugar.
Быстрее ли получить узел по его идентификатору или индексированному свойству?
Самый простой способ узнать ответ на этот вопрос - профилировать два запроса.
На основе ID
вы увидите поле NodeByIdSeek
, которое стоит 1 дБ, попадание , а на одном с уникальным ограничением вы увидите поле NodeUniqueIndexSeek
с 2 дБ хитов .
Таким образом, поиск узла по его ID
выполняется быстрее.