2013-07-06 6 views
0

Допустим, что у меня есть некоторые пользовательские узлы, которые FOLLOWS других узлов. Я хочу загрузить список всех пользователей, а также Список тех, с кем они следуют и фильтровать этот список, чтобы получать пользователей, которые следуют определенным узлам. Каков правильный способ сделать это?Neo4j/Cypher - Фильтрация и возврат на тот же тип отношения


Моя первая попытка была:

START n=node(*) 
MATCH n-[:FOLLOWS]->following 
WHERE following.name='John' 
RETURN n, COLLECT(following) 

который, очевидно, не работает, как и все последующие пользователи фильтруются за исключением Иоанна, так сборным() всегда имеет только что один пользователь.


Моя следующая попытка была загрузить соответствующие узлы дважды:

START n=node(*) 
MATCH n-[:FOLLOWS]->following_filter 
    , n-[:FOLLOWS]->following_all 
WHERE following_filter.name='John' 
RETURN n, COLLECT(following_all) 

который, казалось, хорошо работают на первый, но в тот момент я добавить еще один пункт MATCH, чтобы я начала получать частичный список с последующим пользователей снова. Любая идея, почему это происходит?


Другим возможным решением, которое делает, кажется, хорошо работать с WITH и ANY:

START n=node(*) 
MATCH n-[:FOLLOWS]->following 
WITH n, COLLECT(following) AS following 
WHERE ANY(x in following WHERE x.name='John') 
RETURN n, COLLECT(following) 

Однако я предпочитаю избегать использования WITH сейчас и найти другое решение. Я генерирую эти запросы с query builder Я написал, что еще не поддерживает WITH, и требует некоторых архитектурных изменений, чтобы добавить поддержку для этого, что займет некоторое время. Я действительно понимаю, что это не очень хорошая причина, чтобы избежать WITH, и я в конечном итоге добавлю поддержку для этого, но я действительно предпочитаю что-то работать сейчас и при необходимости изменить позже.


Я могу также использовать шаблон как ИНЕКЕ:

START n=node(*), john=node(888) 
MATCH n-[:FOLLOWS]->following 
WHERE n-[:FOLLOWS]->john 
RETURN n, COLLECT(following) 

Но мне кажется, что я могу только загрузить мой «John» узел с использованием ID или Lucene индекс, и потеря полной выразительной Сила Гриффера.

ответ

1
START n=node(*) 
MATCH following_all<-[:FOLLOWS]-n-[:FOLLOWS]->following_filter 
WHERE following_filter.name='John' 
RETURN n, COLLECT(following_all) 
+0

У меня такая же проблема с моей второй попыткой - она ​​работает хорошо, пока я не добавлю другое предложение MATCH. См. Здесь: http://console.neo4j.org/r/ys5z4l (обратите внимание, что Neo имеет два исходящих отношения KNOWS и что он возвращает оба из них, когда совпадение LOVES удалено) – shesek

+0

Итак, вы пытались использовать 'WITH'? ? но почему вы избегаете его использования? –

+0

Я упомянул об этом в вопросе - я работаю с построителем запросов, который не поддерживает WITH. есть ли альтернативные методы? – shesek

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