Самый эффективный способ найти связи между узлами в Cypher/Neo4J?

Мне нужно найти соединения между всеми узлами (с меткой «Хэштег»), подключенными к основному пользовательскому узлу.

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

У кого-нибудь есть лучшие идеи?

MATCH (u:User{uid:"777"}), (c1:Hashtag), (c2:Hashtag), 
c1-[:BY]->u, c2-[:BY]->u, c1-[rel:TO]->c2 RETURN rel,c1,c2;

(я работаю с Neo4J/Cypher 2.0)


person Aerodynamika    schedule 13.02.2014    source источник


Ответы (1)


Попробуйте это, поиграйтесь с этим и дайте мне знать результат.

MATCH (u:User {uid:"777"})
WITH u
MATCH u<-[:BY]-(c1:Hashtag)-[rel:TO]-(c2:Hashtag)--(u)
RETURN rel, c1, c2

В принципе, идея здесь следующая:

  1. Сначала сопоставьте узел пользователя
  2. Используйте его, чтобы сопоставить все узлы «Хэштег»
  3. Используйте его для сопоставления со всеми узлами «Хэштег», связанными с предыдущими узлами «Хэштег».
  4. Возвращает «rel», который представляет собой все отношения от узлов «Hashtag» к узлам «Hashtag», которые подключены к пользователю 777.
person arijeet    schedule 13.02.2014
comment
кажется, работает намного быстрее, спасибо! :) подождем, что скажут другие... отличная идея! - person Aerodynamika; 14.02.2014
comment
но одна проблема, тогда мы получаем узлы c2, которые не обязательно связаны с пользователем :BY... и мне нужно, чтобы все они были подключены к пользователю. поэтому, возможно, мы должны добавить ...(c2:Hashtag)-[:BY]-›u, но тогда это примерно то же самое, что и выше... - person Aerodynamika; 14.02.2014
comment
о, я уже пытался добавить u, и это работает (также добавление направлений к ‹-[rel:TO] и -[:BY]-u), кажется, что оба запроса занимают одинаковое количество времени, и их запуск с префиксом PROFILE в neo4j- sh на самом деле показывает точно такой же результат. - person Aerodynamika; 14.02.2014