apoc.path.expandConfig () extract (subject) - триплет [объект] -> (предикат) - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь написать зашифрованный запрос, который при заданном конкретном начале и фиксированном завершающем узле будет расширять путь и извлекать мне узлы и отношения в следующем формате.

(node1)-[relation]->[node2] ie (subject)-[object]->(predicate) triplet

Это запрос шифра, который я пытаюсь выполнить:

MATCH (e1: Location { name: 'Pune' }), (e2: Location { name: 'Bangalore' })
CALL apoc.path.expandConfig(e1, { terminatorNodes: [e2], limit: 2  }) YIELD path
WITH [relation in relationships(path) | type(relation)] as rel, nodes(path) as nodes
RETURN { Relations: rel, Nodes: nodes } as results

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


Обновление:

Мне нужно многократные пути с соотношением между ними, есть ли шанс использовать nodesсписок

1 Ответ

0 голосов
/ 25 января 2019

Здесь 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
...