Здесь limit: 2
означает, что вы получите 2 пути результата, а не то, что длина пути равна 2. Вы можете использовать свойства конфигурации minLevel
и maxLevel
, чтобы ограничить количество выполняемых расширений. Для одного раскрытия (начальный узел, 1 отношение, конечный узел) вы можете установить оба значения на 1.
Что касается форматирования этого вывода, самый простой способ - установить Процедуры APOC и использовать функцию apoc.text.format () (это работает как метод sprintf () java).
Например:
MATCH (e1: Location { name: 'Pune' }), (e2: Location { name: 'Bangalore' })
CALL apoc.path.expandConfig(e1, { terminatorNodes: [e2], minLevel: 1, maxLevel:1 }) YIELD path
WITH e1, e2, [relation in relationships(path) | type(relation)][0] as rel
RETURN apoc.text.format('(%s)-[%s]->(%s)',[e1.name, rel, e2.name])
Тем не менее, я не уверен, что здесь необходим расширитель пути. Сайфер должен быть адекватным, если в игре нет особых обстоятельств:
MATCH (e1: Location { name: 'Pune' }), (e2: Location { name: 'Bangalore' })
MATCH (e1)-[rel]->(e)
where e = e2 // to force a 2-node index lookup and hash join
WITH e1, e2, type(rel) as rel
RETURN apoc.text.format('(%s)-[%s]->(%s)',[e1.name, rel, e2.name])
EDIT
Хорошо, похоже, вам это нужно, чтобы найти пути нескольких прыжков, некоторые ограничения на пути и увидеть представление путей в виде наборов троек.
К сожалению, хотя пути отображаются в этом виде тройного формата (показаны все свойства для каждого элемента), пути не являются списками, и мы не можем манипулировать ими как списками.
Существует функция APOC (apoc.path.elements ()), которая будет предоставлять форму списка пути с чередующимися элементами узел-отношения-узел-отношения, но вы хотите работать с тройками, поэтому нам нужно сделать некоторые манипуляции с этим списком и выбор подсписков с помощью индексов, чтобы получить список всех триплетов в пути. Затем мы можем извлечь нужные нам свойства для триплетов, а затем применить форматирование строки.
Это предполагает, что мы только расширяем исходящие отношения (в противном случае нам нужно было бы приложить больше усилий, чтобы правильно отобразить правильное направление во всех триплетах).
MATCH (e1: Location { name: 'Pune' }), (e2: Location { name: 'Bangalore' })
CALL apoc.path.expandConfig(e1, { terminatorNodes: [e2], relationshipFilter:'>', limit:2}) YIELD path
WITH apoc.path.elements(path) as pathElements
WITH [idx in range(0, size(pathElements) - 1) | CASE WHEN idx % 2 = 0 THEN pathElements[idx].name ELSE type(pathElements[idx]) END] as pathElements
WITH [idx in range(0, size(pathElements) - 2, 2) | pathElements[idx..idx+3]] as triplets
WITH [triplet in triplets | apoc.text.format('(%s)-[%s]->(%s)', triplet)] as tripletsText
RETURN tripletsText