У меня есть общая структура графа, в которой мне нужно найти нелистовые узлы в графе на основе их соединений с другими узлами в графе. Положение узла, который я хочу вернуть, не определено, и возможно, есть несколько путей к узлу, который я хочу вернуть. Я хочу выполнить один запрос, чтобы вернуть клиенту группу элементов, которые я отображаю в отсортированном списке. Я не хочу выполнять несколько асинхронных запросов и выполнять сортировку на стороне клиента.
Этот список фильтруется на основе ребер, которые соединяют вершины вместе, или если узел соединен с другим узлом. Условия фильтрации обновляются на стороне клиента, что приводит к повторному построению запроса и повторному запросу базы данных. Не гарантируется, что положение узлов в графе, которые необходимо вернуть, будет одинаковым для всех результатов, они могут быть листовыми узлами или где угодно на пути. Вершины, которые я хочу вернуть, можно идентифицировать по атрибутам на ребрах, ведущих к ним или от них. На каждом ребре также есть атрибут даты, который используется для сортировки, и атрибут типа, который используется для фильтрации.
Изображение на графике myGraph, которое я попытался проиллюстрировать ниже.
-------
| v:1 |\
------- \
| \ \ -------
| | \| v:4 |\
| \ ------- \
| | / ^ \ -------
| \/ | \| v:7 |
| /| return -------
| / \
| / |
------- \
| v:2 |\ |
------- \ \
| \ -------
| \| v:5 |\
| ------- \
| \ -------
| \| v:8 |\
| ------- \
| ^ \ -------
| | \| v:10|
------- return -------
| v:3 |\
------- \
\ -------
\| v:6 |\
------- \
\ -------
\| v:9 |
-------
^
|
return
На приведенной выше диаграмме показано, что я хочу вернуть при одном наборе условий фильтрации, но возвращаемые результаты могут измениться, если я изменю условия фильтрации. Узлы, которые я хочу вернуть, легко идентифицируются по атрибутам на краях, ведущих к ним или от них.
У меня есть запрос, который выглядит примерно так, но мне не удается найти способ проиндексировать узлы на пути, у которых есть края, ведущие к ним или от них, которые соответствуют определенным критериям фильтрации.
FOR item in vertexCollection1
FILTER .... // FILTER the vertices
FOR v, e, p IN 1..4 OUTBOUND item._id GRAPH 'myGraph'
// ?? Not sure how to efficiently return from here
// ?? FILTER p.vertices[??].v == 7 OR p.vertices[??].v == 10
// ?? FILTER p.edges[??].type == "type1" OR p.edges[??].type == "type2"... etc based on user selections
// ?? LET date = p.edges[vertexPosition - 1].date
// ?? LET data = p.vertices[??]
// SORT DATE_TIMESTAMP(date) DESC
// RETURN {date: date, data: data}
В настоящее время я использую операцию [**] для получения конкретного узла в зависимости от того, в какой коллекции он находится, используя что-то вроде следующего:
LET data = p.vertices[ ** FILTER CONTAINS(CURRENT._id, "collectionName") OR ...]
но это неудобно и требует, чтобы вершины были помещены в определенные коллекции, чтобы облегчить построение запроса. Это также не решает проблему того, как индексировать связанные ребра, соединяющиеся с узлом, который я хочу вернуть.
Прошу прощения, если на этот вопрос дан ответ в другом месте, и если это указатель на ответ, приветствуется. Я не уверен в правильности терминологии, чтобы кратко описать проблему и выполнить поиск соответственно.
Спасибо!