8.5.5.1 Длина переменной
Вместо описания длинного пути в образце, использующего последовательность множества узлов и связей, многие связи (и промежуточные узлы) могут быть заданы с помощью указания длины в описании связи образца. Например,
(a)-[*2]->(b)
Этот образец описывает граф из трех узлов и двух связей, всех в одном пути (путь длиной 2). Такая запись эквивалентна следующей:
(a)-->()-->(b)
Также может быть задан диапазон длин: подобные образцы связей называются «связями переменной длины». Например:
(a)-[*3..5]->(b)
Т.е. минимальная длина равна 3, а максимальная - 5. Этот образец описывает граф, состоящий либо из 4 узлов и трех связей, либо 5 узлов и 4 связей, либо 6 узлов и 5 связей, связанных вместе в одном пути.
Любая граница может быть опущена. Например, для описания путей длиной 3 или более, используется запись
(a)-[*3..]->(b)
А для описания путей длиной 5 или менее, пишем:
(a)-[*..5]->(b)
Можно опустить обе границы, что описывает путь произвольной длины:
(a)-[*]->(b)
В качестве простого примера давайте рассмотрим следующий запрос:
MATCH (me)-[:KNOWS*1..2]-(remote_friend) WHERE me.name = "Filipa" RETURN remote_friend.name
remote_friend.name |
---|
"Dilshad" |
"Anders" |
Этот запрос находит данные в графе, форма которого отвечает такому образцу:
Определить узел (со значением свойства name, равным Filipa), и затем узлы со связью KNOWS на расстоянии одного или двух шагов. Это типичный пример нахождения друзей из первого и второго круга (друзья друзей).
Отметим, что связи переменной длины не могут использоваться с CREATE и MERGE.
8.5.6 Назначение идентификаторов пути
Как было упомянуто выше, последовательность связанных узлов и связей называется «путь». Cypher позволяет присваивать имя пути, используя идентификатор, например, так:
p = (a)-[*3..5]->(b)
Вы можете делать это в предложениях MATCH, CREATE и MERGE, но не при использовании образца в качестве выражения.