Как я могу сделать этот запрос neo4j быстрее? - PullRequest
0 голосов
/ 20 июня 2019

У меня есть база данных, которая содержит эти четыре узла:

Магазин, Гитара, GuitarModel, Аксессуар

* Гитара - это особая гитара, которой человек может владеть / играть

optional match (a:Store), (b:Guitar), (c:GuitarModel), (d:Accessory)
where a.StoreNumber ="1234" and (a)-[:ContainsGuitar]->(b) and
(b)-[:IS_OF_MODEL]->(c) and 
((d)-[:COMES_STANDARD]-(c) OR (d)-[:COMES_OPTIONAL]-(c) OR (d)-:COMES_OPTION_UPGRADE]-(c) OR (d)-[:COMES_UPGRADE]-(c))
return b.name, collect(d.name)

Моя проблема сейчас заключается в том, что этот запрос довольно медленный, его выполнение занимает около 120 000 мс.

У меня 67 000 узлов и 131 000 связей.

Так я что-то делаю не так, что замедляю?

1 Ответ

1 голос
/ 20 июня 2019
  • У вас есть индекс / ограничение для :Store(StoreNumber)?
  • Почему вы используете только дополнительное совпадение?Вы можете комбинировать MATCH & OPTIONAL MATCH
  • Почему вы делаете свой шаблон в предложении WHERE?Вы должны поместить его непосредственно в MATCH.

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

Можете ли вы попробовать этот запрос:

MATCH 
  (:Store { StoreNumber:"1234" })-[:ContainsGuitar]->(b)
RETURN 
  b.name, 
  [(b)-[:IS_OF_MODEL]->(:GuitarModel)-[:COMES_STANDARD|COMES_OPTIONAL|COMES_OPTION_UPGRADE|COMES_UPGRADE]-(d:Accessory) | d.name]
...