ArangoDB: обходы, когда ребра соединяются с другими ребрами

Недавно я прочитал, что ArangoDB может соединять ребра с другими ребрами в графе. Как в этой ситуации будет работать запрос пути? Например:

car <-------- part
        ^
        |
        |
installationEvidence

В этом случае installationEvidence - это узел, соединяющий край между деталью и автомобилем. Начиная с автомобильного узла, какой AQL должен возвращать installationEvidence, но не part? Учитываются ли оба installationEvidence и part на уровне p.vertices[1]?


person Nate Gardner    schedule 22.10.2016    source источник


Ответы (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
    [...]

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

person mchacki    schedule 23.10.2016
comment
Полезно знать, я понятия не имел, что край может указывать на другой край, но это имеет смысл. Поскольку набор ребер состоит только из _to и _from, они могут указывать на любой допустимый _id. - person David Thomas; 23.10.2016
comment
Спасибо за отличную информацию! Означает ли это, что for v, e, p in 1..2 с синтаксисом p.edges[1] и p.vertices[1] просто не применяется? Это потенциальный вариант использования для моей команды, однако маловероятно, что мы включим его в ближайшем будущем. Мы исследуем это как способ упростить структуру нашего запроса и получить более прямой доступ к некоторым релевантным данным. - person Nate Gardner; 26.10.2016
comment
Мы еще не решили, какой синтаксис мы хотим использовать, можем ли мы повторно использовать тот, который уже существует (что я предпочитаю), или это будет очень запутать. Дело в том, что если мы перейдем от car к installationEvidence, как должен выглядеть p? {vertices: [car, installationEvidence], edges: [car<--part, *<--evidence ]} в этом случае довольно сложно определить реальную связь между вершинами и ребрами. Мы рады помочь вам в этом и найти решение, соответствующее нашим потребностям. - person mchacki; 29.10.2016
comment
Спасибо! На данный момент мы работали над этим, так что это не критическая необходимость, но когда мы перейдем к этапу оптимизации базы данных, мы можем вернуться к этому! - person Nate Gardner; 01.11.2016