neo4j улучшение производительности декартовых продуктов

У меня есть база данных Graph с более чем 2 миллионами узлов. У меня есть приложение, которое берет социальный граф и делает на нем какие-то выводы. В качестве одного шага алгоритма я должен получить все возможные комбинации отношений [: друзей] двух связанных узлов. В настоящее время у меня есть запрос, который выглядит так: match (a) - [: friend] - (c), (b) - [: friend] - (d), где id (a) = {ida} и id (b) = {idb} возвращает отдельный c как первый, d как второй

Итак, я уже знаю узлы a и b и хочу получить все возможные пары, которые можно составить из друзей a и b. Очевидно, что это очень медленная операция. Мне было интересно, есть ли более эффективный способ получить тот же результат в neo4j. Возможно, добавление индексов может помочь? Любые идеи / подсказки приветствуются!

Пример У узла a есть друзья: x, y У узла b есть друзья: g, h, i`` Then the result should be: x,g x,h x,i y,g y,h y,i`


person Mohammad Ghufran    schedule 05.11.2014    source источник


Ответы (2)


Если вы еще этого не сделали, вам следует использовать ярлыки для ускорения запроса, что может выглядеть так:

MATCH (p1:Person)-[:FRIEND]->(p3:Person),(p2:Person)-[:FRIEND]->(p4:Person)
WHERE ID(p1) = 6 AND ID(p2) = 7
RETURN p3 as first, p4 as second

Очевидно, это будет зависеть от того, что вы создали свои узлы с меткой :Person.

Сколько друзей у среднего узла?

person JohnMark13    schedule 05.11.2014
comment
Спасибо за ответ. Не могли бы вы также объяснить, почему это поможет? Я понятия не имею о среднем количестве друзей, но оно сильно различается. От очень немногих (менее 10) до сотен или даже тысяч. - person Mohammad Ghufran; 05.11.2014

Я бы не стал использовать два шаблона, а только один и оператор IN.

MATCH (p:Person)-[:FRIEND]->(friend:Person) 
WHERE id(p) IN [1,2,3]
RETURN p, collect(friend) as friends

Тогда у вас нет кросс-продукта, и вы также можете красиво вернуть друзей в виде коллекции на человека.

person Michael Hunger    schedule 16.11.2014