Я пытаюсь найти зашифрованный запрос, который даст мне сквозной путь в переменной.Я не хочу каждый сегмент пути в качестве новой строки.Позвольте мне объяснить.
Мой набор данных в основном состоит из миллионов Actions
с отношением Next
к следующим действиям.Я попробовал следующий запрос MATCH x=(:Action)-[:NEXT*]->(:Action)
.Это дает правильный результат в виде графика.Тем не менее, результат строки не то, что я хочу.
Допустим, это мой набор данных.С помощью приведенного выше запроса я получаю следующий результат: 0->1, 1->2, 2->3, 0->1->2, 1->2->3, ...
(поэтому каждый возможный сегмент пути, удовлетворяющий требованиям запроса) Мне нужен только путь e2e, поэтому 0->1->2->3
.Для этого набора данных это не имеет большого значения.Реальный набор данных, тем не менее, содержит намного, гораздо более длинные и гораздо более несвязанные пути.Даже с небольшим набором данных этот запрос занимает много времени и возвращает много.Каждое следующее действие, добавленное к ссылке, будет экспоненциально увеличивать количество возвращаемых строк, и из-за этого запрос будет ужасно медленным.
Итак, вопрос, как мне получить только эти результаты e2e?Длина ссылки является переменной, как и начальный и конечный узлы.Эти ссылки, как правило, намного длиннее, но они фильтруются ранее в запросе, поэтому я не могу просто сделать что-то вроде проверки той, у которой нет следующего отношения к ней / из нее.
Причина, по которой мне это нужно, заключается в том, что я продолжаю работать с этой переменной, а не просто возвращаю ее.
ОБНОВЛЕНИЕ:
Более точная версия того, что будет в базе данных.
Теперь я могу фильтровать по дневному диапазону, по начальной или конечной точке.Например, с помощью следующего запроса
// 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)
я получаю следующий результат.
В режиме просмотра графика это правильно.Однако в результате я возвращаюсь к своему приложению .net:
Это слишком много.Опять же, для этого набора данных это не большая проблема, но я говорю о больших данных здесь.Миллионы записей будут результатом после фильтрации.Проблема в том, что мой результат содержит каждый сегмент пути в результате, и я просто хочу, чтобы пути e2e были 1 строкой результата.