Получите сквозной путь узлов с Cypher - PullRequest
0 голосов
/ 25 февраля 2019

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

Мой набор данных в основном состоит из миллионов Actions с отношением Next к следующим действиям.Я попробовал следующий запрос MATCH x=(:Action)-[:NEXT*]->(:Action).Это дает правильный результат в виде графика.Тем не менее, результат строки не то, что я хочу.

required result Допустим, это мой набор данных.С помощью приведенного выше запроса я получаю следующий результат: 0->1, 1->2, 2->3, 0->1->2, 1->2->3, ... (поэтому каждый возможный сегмент пути, удовлетворяющий требованиям запроса) Мне нужен только путь e2e, поэтому 0->1->2->3.Для этого набора данных это не имеет большого значения.Реальный набор данных, тем не менее, содержит намного, гораздо более длинные и гораздо более несвязанные пути.Даже с небольшим набором данных этот запрос занимает много времени и возвращает много.Каждое следующее действие, добавленное к ссылке, будет экспоненциально увеличивать количество возвращаемых строк, и из-за этого запрос будет ужасно медленным.

Итак, вопрос, как мне получить только эти результаты e2e?Длина ссылки является переменной, как и начальный и конечный узлы.Эти ссылки, как правило, намного длиннее, но они фильтруются ранее в запросе, поэтому я не могу просто сделать что-то вроде проверки той, у которой нет следующего отношения к ней / из нее.

Причина, по которой мне это нужно, заключается в том, что я продолжаю работать с этой переменной, а не просто возвращаю ее.

ОБНОВЛЕНИЕ:

Более точная версия того, что будет в базе данных.Data set

Теперь я могу фильтровать по дневному диапазону, по начальной или конечной точке.Например, с помощью следующего запроса

// Get the days between the specified start&end
MATCH x=(a:Day{Date:'2019-02-23'})-[:NEXT*0..]->(b:Day{Date:'2019-02-26'})
WITH [n IN NODES(x) | Id(n)] as dayIds
MATCH (startDay:Day)<-[:ON]-(startAction:Item)
MATCH (endDay:Day)<-[:ON]-(endA:Item)
WHERE Id(startDay) IN dayIds AND Id(endDay) IN dayIds
// Filter on America as end
MATCH (endAction)-[:IN]->(toNode:Place)
WHERE Id(toNode) IN [44] //Id of America
MATCH result=(startAction)-[:NEXT*]->(endAction)
RETURN result

Итак, я фильтрую действия начала и конца, чтобы они находились в указанном диапазоне.Затем я отфильтровываю конечное действие, проводимое в АмерикеПосле выполнения MATCH result=(startAction)-[:NEXT*]->(endAction) я получаю следующий результат.

result

В режиме просмотра графика это правильно.Однако в результате я возвращаюсь к своему приложению .net:

result view

Это слишком много.Опять же, для этого набора данных это не большая проблема, но я говорю о больших данных здесь.Миллионы записей будут результатом после фильтрации.Проблема в том, что мой результат содержит каждый сегмент пути в результате, и я просто хочу, чтобы пути e2e были 1 строкой результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...