Почему этот запрос шифра никогда не заканчивается - PullRequest
0 голосов
/ 10 июня 2019

Это запрос:

MATCH (t:Table)-[*]-(a:Attribute) RETURN t,a

Вот полный график: The entire graph

Вот запрос и что происходит, когда я пытаюсь выполнитьэто: Browser locks up

1 Ответ

1 голос
/ 10 июня 2019

Причина в том, что вы выполняете отношение переменной длины без верхней границы.Cypher будет пытаться найти все возможные пути в существовании, которые могут быть созданы независимо от длины пути, при условии, что путь начинается с узла: Table и заканчивается узлом: Attribute.Хотя связь будет проходиться только один раз для каждого пути, нет никаких ограничений на использование другой связи для возврата к ранее пройденному узлу, а затем использование другой, пока еще не прослеженной, связи в пути, чтобы выйти из нее и продолжитьобходе.

Даже на небольшом графике число возможных путей увеличивается.Вы можете сами убедиться, как растет число путей и как db будет медленнее, поскольку число возможных путей для исследования взрывается.

MATCH (:Table)-[*..6]-(:Attribute) 
RETURN count(*) as pathsFound

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

Хотя я сэкономлю тебе немного времени.Я пересоздал ваш график, и вы достигли максимально возможных путей, когда у вас есть верхняя граница из 23 прыжков, возвращая количество 1371112 полных различных путей в вашем графике, соответствующих этому шаблону.Один браузер не сможет справиться с таким количеством строк данных.

Вот два запроса, которые можно выполнить, чтобы проверить его (при условии, что это весь ваш график):

MATCH (:Table)-[*..23]-(:Attribute) 
RETURN count(*) as totalPathsFound

и

MATCH path = (:Table)-[*..23]-(:Attribute) 
RETURN length(path) as pathLength, count(*) as pathsFound
ORDER BY pathLength DESC

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

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

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