Neo4j — производительность поиска по свойствам края в предложении WHERE

У меня есть модель данных, которую я хочу примерно смоделировать по статье, опубликованной в этом Graphgist.

Мне любопытно, какую производительность я могу ожидать от предложения WHERE в случае, если заданный набор из двух узлов имеет большое количество отношений между ними с параметрами «от» и «до», определенными на каждом ребре. Когда вы выполняете такой запрос на сопоставление, где у вас, скажем, 100 отношений SELLS, как Neo4J справляется с производительностью фильтрации по краям только до тех, которые имеют значение, на основе критериев WHERE:

MATCH (s:Shop{shop_id:1})-[r1:SELLS]->(p:Product)
WHERE (r1.from <= 1391558400000 AND r1.to > 1391558400000)
MATCH (p)-[r2:STATE]->(ps:ProductState)
WHERE (r2.from <= 1391558400000 AND r2.to > 1391558400000)
RETURN p.product_id AS productId,
   ps.name AS product,
   ps.price AS price
ORDER BY price DESC

Я не нашел способа напрямую индексировать свойства на ребре, поэтому я предполагаю, что либо оптимизатор запросов может позаботиться о чем-то подобном, либо он просто буквально проходит массив ребер и находит те, которые соответствуют.


person Micah    schedule 24.09.2015    source источник


Ответы (1)


Neo4j просто пройдет все отношения и прочитает значение свойства. По умолчанию нет индексов для свойств отношений (это можно сделать с помощью устаревших индексов: см. документацию).

Что касается производительности, имейте в виду, что Neo4j очень быстро просматривает отношения, поэтому, хотя ваш запрос «очень дорогой», Neo4j может проходить от 2 до 4 миллионов отношений в секунду и на ядро ​​в зависимости от конфигурации вашего оборудования.

Итак, подведем итог: для 100 отношений он будет работать как молния, но в настоящее время он совсем не оптимизирован, поэтому вы увидите некоторые недостатки, если вам нужно выполнить те же операции, например, для 1 миллиона отношений.

person Christophe Willemsen    schedule 24.09.2015
comment
Это имеет большой смысл. Спасибо за ответ, и мы пока продолжим, как и планировалось. Свойство представляет собой отметку времени, поэтому, как правило, индексировать его не имеет смысла, но я задавался вопросом, будет ли это иметь какое-либо серьезное преимущество при обходе, но похоже, что, скорее всего, ничего не получится. Цените помощь! - person Micah; 25.09.2015