2013-07-03 3 views
0

Так, говорят, что у меня есть список узлов, например, так:Получить Длина пути от Cypher Query

A -> B -> C -> D -> ...

Я хочу добавьте узел F в начало этого списка. Чтобы усложнить этот шаблон, мне может быть дана ссылка на любой узел в этом списке в качестве «начальной точки», из которой мне нужно будет получить начальную точку. Например, я мог бы дать ссылку на узел «C», и нужно вывести алгоритм, который возвращает ссылку на А.

Я полагаю, что это должно быть в состоянии сделать с помощью запроса, такие как

START n = node(*), a = node(*) 
    MATCH a -[:LINKED*]> n 
    WHERE n.id! = <ID> 
    RETURN a 

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

-pYr0

ответ

5

Длина функция: http://docs.neo4j.org/chunked/stable/query-functions-scalar.html#functions-length

START n = node(*), a = node(*) 
MATCH p=a -[:LINKED*]-> n 
WHERE n.id! = <ID> 
RETURN a 
ORDER BY length(p) desc 
+2

вы, вероятно, хотите 'длину (р) desc', чтобы получить самую длинную –

+0

совершенна, именно то, что мне было нужно. Не могу поверить, что я пропустил это в документации ... * facepalm * – pYr0

1

Если вы хотите голова списка, вы можете также соответствовать с опциональными отношениями, ведущими в ваш кандидата узел. Если отношения не существуют, вы там.

Предполагая, что вы получили ID некоторого узла в цепочке:

START n = node(<ID>) 
MATCH() -[r?:LINKED]-> a -[:LINKED*]-> n 
WHERE r = null 
RETURN a 
+0

Хорошая точка. Я думаю, что более эффективным является 'match a - [: LINKED *] -> n, где not (() - [: LINKED] -> a)'. –

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