2014-02-13 2 views
1

Мне нужно найти соединения между всеми узлами (с меткой «Hashtag»), подключенными к основному пользовательскому узлу.Самый эффективный способ найти соединения между узлами в 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)

ответ

2

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

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

В принципе, идея здесь состоит в следующем:

  1. спичек узел пользователя первый
  2. Используйте его, чтобы соответствовать узлы всех «хэштегом»
  3. Используйте его, чтобы соответствовать всем «хэштегом 'узлы, подключенные к предыдущим узлам Hashtag
  4. Возврат' rel ', который представляет собой все отношения от узлов Hashtag до узлов Hashtag, которые подключены к пользователю. 777
+0

, похоже, работает намного быстрее, спасибо! :) давайте подождем, что другие говорят немного ... отличная идея! –

+0

, но одна проблема, тогда мы получаем узлы c2, которые не обязательно связаны с: BY пользователем ... и мне все они связаны с пользователем. так что, возможно, мы должны добавить ... (c2: Hashtag) - [: BY] -> u, но тогда это похоже на то, что указано выше ... –

+0

Посмотрите, работает ли исправление. Добавлено - (u) – arijeet

Смежные вопросы