Допустим, что у меня есть некоторые пользовательские узлы, которые 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 индекс, и потеря полной выразительной Сила Гриффера.
У меня такая же проблема с моей второй попыткой - она работает хорошо, пока я не добавлю другое предложение MATCH. См. Здесь: http://console.neo4j.org/r/ys5z4l (обратите внимание, что Neo имеет два исходящих отношения KNOWS и что он возвращает оба из них, когда совпадение LOVES удалено) – shesek
Итак, вы пытались использовать 'WITH'? ? но почему вы избегаете его использования? –
Я упомянул об этом в вопросе - я работаю с построителем запросов, который не поддерживает WITH. есть ли альтернативные методы? – shesek