2014-11-05 2 views
0

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

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

Пример Узел a имеет друзей: x, y Узел b имеет друзей: g, h, i`` Then the result should be: х , г х , ч х , я у , г у , ч у , я `

ответ

1

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

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 меткой.

Сколько друзей имеет средний узел?

+0

Благодарим вас за ответ. Не могли бы вы также объяснить, почему это поможет? Я не имею представления о среднем числе друзей, но он сильно меняется. От нескольких (менее 10) до сотен или даже тысяч. –

0

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

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

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