#graph-databases #arangodb #aql
#графические базы данных #arangodb #aql
Вопрос:
Недавно я прочитал, что ArangoDB способен соединять ребра с другими ребрами в графе. Как в этой ситуации будет выполняться запрос пути? Например:
car <-------- part
^
|
|
installationEvidence
В этом случае installationEvidence
является узлом, соединяющимся с ребром между деталью и автомобилем. Начиная с узла car, какой AQL должен возвращать, installationEvidence
но не part
возвращает? Рассматриваются ли оба installationEvidence
и part
на p.vertices[1]
уровне?
Ответ №1:
В ArangoDB ребра представляют собой особый тип документов. Вот почему вы можете хранить ребра, указывающие на другие ребра. С точки зрения запроса для этих ребер есть два направления: A) Обход приводит к target edge
. В этом случае предполагается, что это общий тип документа, и обход не будет следовать ни в каком направлении target edge
. Это означает, что вам пришлось бы написать 2 шага обхода в инструкции. Первое заканчивается на ребре. Второй, начинающийся с _from
или _to
ребра. В вашем случае запрос мог бы выглядеть следующим образом:
FOR edge IN 1 OUTBOUND @installationEvidece @@edges1
LET car = DOCUMENT(edge._to)
RETURN car
Б) Обход проходит через ребро, на которое указывают другие ребра.
Этот случай более сложный. В архитектуре ArangoDB «вершина» ничего не знает о присоединенных к ней ребрах, ребра знают свои вершины.
Что вы могли бы сделать в этом случае, так это снова написать два оператора обхода, где второй начинается с встреченного ребра, например:
FOR part,edge IN 1 INBOUND @car @@edges1
FOR installationEvidence IN 1 INBOUND edge @@edges2
[...]
На данный момент мы не столкнулись с каким-либо прецедентом клиентов, чтобы сделать вышеупомянутый обход более прозрачным. Если это важно для вас, пожалуйста, свяжитесь с нами, и мы сможем увеличить приоритет, чтобы упростить формулирование запросов такого рода.
Комментарии:
1. Приятно знать, я понятия не имел, что ребро может указывать на другое ребро, но это имеет смысл. Поскольку коллекция ребер — это просто
_to
и_from
, то они могут указывать на любой допустимый_id
.2. Спасибо за отличную информацию! Означает ли это, что синтаксис
for v, e, p in 1..2
сp.edges[1]
иp.vertices[1]
просто не применяется? Это потенциальный вариант использования для моей команды, однако маловероятно, что мы включим его в ближайшем будущем. Мы исследуем это как способ упростить нашу структуру запросов и получить более прямой доступ к некоторым релевантным данным.3. Мы еще не решили, какой синтаксис мы хотим использовать, можем ли мы повторно использовать тот, который уже есть (что я предпочитаю), или это было бы крайне запутанно. Дело в том, что если мы перейдем от
car
кinstallationEvidence
тому, как должноp
выглядеть?{vertices: [car, installationEvidence], edges: [car<--part, *<--evidence ]}
в этом случае довольно сложно определить фактическую связь между вершинами и ребрами. Мы рады помочь вам с этим и найти решение, которое соответствует обеим нашим потребностям.4. Спасибо! Мы пока обошли это, так что это не критическая необходимость, но когда мы перейдем к этапу оптимизации базы данных, мы можем вернуться к этому!
5. @mchacki есть ли какие-нибудь новости об этой функции? удалось ли команде ArangoDB определить унифицированный синтаксис?