Соответствует ли id исполнителю в Neo4J? - PullRequest
0 голосов
/ 29 сентября 2018

Мне интересно, когда я прочитал данные узла и хочу сопоставить их в другом запросе, какой путь будет иметь лучшую производительность?Используя id как это:

MATCH (n) WHERE ID(n) = 1234

или используя индексы узла:

MATCH (n:Label {SomeIndexProperty: 3456})

Какой из них лучше?

1 Ответ

0 голосов
/ 29 сентября 2018

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 выполняется быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...