Neo4j шифровый запрос для связанного списка

У меня есть график ниже. Лига (l1) начинается с УРОВНЯ r1, а уровни NEXT связаны с использованием отношения NEXT, как показано.

league-[:LEVEL]->r1-[:NEXT]->r2-[:NEXT]->r3-[:NEXT]->r4

Я ищу, чтобы найти все уровни для данной лиги и в порядке. Таким образом, для приведенного выше графика ожидаемый результат r1, r2, r3, r4, У меня есть запрос ниже, но он возвращает все пути.

start l1=node(9)  match l1-[:level]->(level) with level match p=level-[:next*]->(remainingLevels) return p;

Сайферы для создания этого графа. Это уже настроено на http://console.neo4j.org/r/gi6zz3 (не забудьте изменить идентификатор)

CREATE (l1 {name: 'l1'}) return l1;
CREATE (r1 {name: 'r1'}) return r1;
START l1=node(9), r1=node(10) CREATE l1-[r:level]->r1;
CREATE (r2 {name: 'r2'}) return r2;
START r1=node(10), r2=node(11) CREATE r1-[r:next]->r2;
CREATE (r3 {name: 'r3'}) return r3;
START r2=node(11), r3=node(12) CREATE r2-[r:next]->r3;
CREATE (r4 {name: 'r4'}) return r4;
START r3=node(12), r4=node(13) CREATE r3-[r:next]->r4;

3 ответа

Решение

Я очистил ваш набор данных и попытался ответить здесь:

MATCH league-[r:level|next*]->(level) 
WHERE league.name?="l1" 
RETURN level, length(r) AS Dist, r 
ORDER BY length(r)

Запрос начинается в лиге (l1) и прослеживается по всем маршрутам:level и:next, а затем возвращает найденные узлы, отсортированные по расстоянию маршрута, по которому они прибыли, чтобы добраться до него от начального узла.

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

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

Как насчет этого запроса,

Соответствие p=league1-[:level]->(level)-[:next*]->endLevel

ГДЕ league1.name?= 'L1' И НЕ (endLevel-[:next]->())

Возвращаемый хвост (узлы (р))

Мне удалось заставить это работать с запросом ниже.

start l1=node(9) 
match l1-[:level]->(level) 
with level 
match p = level-[:next*]->(remainingLevels) 
with level, max(length(p)) as maxlen 
match p = level-[:next*]->(remainingLevels) 
where length(p)=maxlen
return nodes(p);

Выход

+-----------------------------------------------------------------------------------+
==> | nodes(p)                                                                          |
==> +-----------------------------------------------------------------------------------+
==> | [Node[10]{name:"r1"},Node[11]{name:"r2"},Node[12]{name:"r3"},Node[13]{name:"r4"}] |
==> +-----------------------------------------------------------------------------------+

Любые упрощения или оптимизации приветствуются.

Другие вопросы по тегам