2017-02-14 13 views
0

Я пытаюсь получить подграф на основе запроса узла. запрос должен игнорировать указания отношения, пока все узлы в подграфа связаны: ех: u1 -FRIEND-> u2 -FRIEND-> и3 u4 -FRIEND-> и5 -FRIEND-> u6Neo4j читать все подграфы без дублирования Cypher query

ищет u1 или u2 или u3, должен возвращать набор: [u1, u2, u3]

Я использовал следующий запрос: Cypher

MATCH (a:User)-[:FRIEND_OF*0..]-(b) 
WHERE a.userId = 'some_id' 
WITH a, collect(DISTINCT b) AS sets 
RETURN DISTINCT sets 

проблема заключается в том, что я получаю все перестановок множества, таких как:

DATA: u1 -FRIEND-> u2 -FRIEND-> u3 
RETURN: [u1,u2,u3],[u1,u3,u2],[u2,u1,u3]... 

Как я могу отличить разные наборы, чтобы возвращать только одну перестановку?

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

благодаря

ответ

1

Этот запрос должен работать:

MATCH p=(a:User)-[:FRIEND_OF*0..]-(b) 
WHERE a.userId = 'some_id' 
WITH DISTINCT a, b 
ORDER BY ID(b) 
WITH a, COLLECT(b) AS sets 
RETURN DISTINCT sets; 

Он получает различные a/b пар, упорядочивает b узлы нативным ID, помещает заказанные узлы в коллекции, и, наконец, возвращает различные коллекции.

Для повышения производительности вы можете создать индекс для :User(userId).

+0

Это правильный подход, хотя если ваши подграфы большие, и вы видите хиты производительности, вы можете найти [расширитель пути APOC] (http://stackoverflow.com/a/42227632/92359), чтобы быть более эффективным чем совпадение шаблона переменной длины при расширении для соответствия узлам в подграфе. – InverseFalcon

+0

thanks @cybersam - работает как шарм. также, спасибо за подсказку индекса. – user2405864

+0

Добро пожаловать. Пожалуйста, не забывайте [Принять] (http://meta.stackexchange.com/q/5234/255960) ответ, который наилучшим образом отвечает на ваши вопросы. – cybersam