Эффективный способ найти узлы, у которых есть хотя бы один дочерний элемент с определенным атрибутом - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть график с несколькими связанными узлами, и я хочу найти все: помеченные узлы, у которых есть хотя бы один дочерний узел с меткой: B, которые имеют одинаковое имя и старое имя.

Общее количествоколичество узлов + 6M: узлы A и + 60M: узлы B (каждый узел B связан только с одним узлом A, но каждый узел связан с узлами n B)

до сих порСамый эффективный способ, который я нашел, - найти правильные: узлы B, а затем сопоставить их с узлами: A, наоборот - медленнее

Метод 1

Match (b:B) 
where  b.val1<>b.val2 
with b
match (a:A)-[:Link]-(b)
return count(distinct a)

Версия Cypher: CYPHER 3.5, планировщик: СТОИМОСТЬ, время выполнения: Скомпилировано.155619605 всего дБ за 3756615 мс.

метод результата планирования 1

Метод 2

Match (a:A)-[:Link]-(b:B)
where b.val1<>b.val2 
return count(distinct a)

Результат:

Версия Cypher: CYPHER 3.5, планировщик: COST, время выполнения: COMPILED.155619605 всего дБ за 7122106 мс.

метод результата планировщика 2

Исправьте меня, если я ошибаюсь, но я думаю, что цикл должен быть быстреечерез узлы A (так как их всего + 6M), вместо того, чтобы сначала найти дочерний элемент: B, который удовлетворяет условию, а затем выполнить цикл по связанным узлам: A.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Из предоставленных вами планов запросов в обоих случаях используется один и тот же план.И в обоих случаях это начинается со всех: узлов, расширения: связей LINK и фильтрации.Единственное, что между ними различается, это попадания и пропадания в кеше.

Вы должны убедиться, что ОБЪЯСНЯЕТЕ любые другие потенциальные запросы, чтобы проверить, как они будут выполняться, так как мы хотим видеть, как будет выполняться выполнение.если мы начнем с: B узлов в первую очередь.Нам нужно форсировать это, поэтому мы можем сначала попытаться использовать подсказку сканирования :

Match (b:B) 
using scan b:B
where  b.val1<>b.val2 
match (a:A)-[:Link]-(b)
return count(distinct a)

Если ОБЪЯСНЕНИЕ этого начинается с сканирования метки на узлах: B, затемвперед и ПРОФИЛИРОВАТЬ его и посмотреть, как он работает.

0 голосов
/ 28 февраля 2019

Проверка узлов, помеченных: B, и последующий поиск: узлов с пометкой будет быстрее (ваш первый подход), потому что у нас есть вероятность того, что большая часть узлов: B не будет удовлетворять условию, а затем каждый: B будетподключен только к одному: A.

Об эффективности вашего алгоритма:

Если вы говорите, что каждый из узлов: B подключен только к одному:Узел, я бы порекомендовал использовать другое свойство на каждом из: B узлов для записи идентификатора подключенного: A узла.Таким образом, у вас останется всего один цикл над узлами: B, а цикл над узлами: A будет удален.

Тогда ваш код будет таким простым:

Match (b:B) 
where  b.val1<>b.val2
return count(distinct b.aID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...