ArangoDB поиск связанных вершин

#arangodb

#arangodb

Вопрос:

Я очень новичок в arangodb, и мне это очень нравится, но я изо всех сил пытаюсь создать оператор запроса. У меня есть две коллекции (VA, VB) и граница между ними (EC), я хочу найти поиск Va с определенным фильтром (не по _id), а затем ВЕРНУТЬ документы (VB), подключенные (через EC), где EC имеет определенное свойство (например, active: true)

В документации я нашел только примеры, когда вершина уже известна. Заранее благодарю вас, Jnl

Комментарии:

1. ДЛЯ m В ФИЛЬТРЕ VA m.name == ‘некоторое имя’ ДЛЯ v, e, p В 1..1 ЛЮБОЙ m ГРАФ ‘namedGraph’ ФИЛЬТРУЕТ p.ребра [0].активный == true ВОЗВРАЩАЕТ v

Ответ №1:

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

Это пример, который будет работать только с использованием трех коллекций напрямую:

 FOR va IN VA
FILTER va.name == 'Bob'
    FOR e IN EC
    FILTER e._from == va._id amp;amp; e.active == true
        FOR vb IN VB
        FILTER e._to == vb._id
        RETURN vb
 

Если вы хотите использовать график, который выглядит так, как будто вы, возможно, тестировали его, тогда это сработает:

 LET myOrigin = FIRST(FOR d IN VA FILTER d.name == 'Bob' RETURN d._id)

FOR v, e, p IN 1..1 OUTBOUND myOrigin GRAPH 'GD'
FILTER p.edges[0].active == true
RETURN p.vertices[1]
 

Следует отметить, что myOrigin это должен быть _id, что означает при установке значения, которое вы используете FIRST(...) при присвоении значения. Это гарантирует, что вы получите обратно одно значение (первое), а не массив.

Ваш пример также работает:

 FOR m IN VA FILTER m.name == 'Bob' 
    FOR v, e, p IN 1..1 ANY m GRAPH 'GD' 
    FILTER p.edges[0].active == true 
    RETURN v 
 

Следует отметить, что этот пример может соответствовать более чем одному документу (поскольку может быть .name == 'Bob' несколько документов, и он вернет все узлы в VB этом совпадении.

Если вы хотели, чтобы результаты показывали, какая запись в VA была связана с VB, и у вас была возможность иметь несколько совпадающих значений VA, это поможет вам:

 FOR m IN VA FILTER m.name == 'Bob' 
    FOR v, e, p IN 1..1 ANY m GRAPH 'GD' 
    FILTER p.edges[0].active == true 
    RETURN {
        origin: m,
        connected_to: v 
    }
 

Если вы хотите очистить результаты, вы можете использовать UNSET, чтобы улучшить результаты:

 FOR m IN VA FILTER m.name == 'Bob' 
    FOR v, e, p IN 1..1 ANY m GRAPH 'GD' 
    FILTER p.edges[0].active == true 
    RETURN {
        origin: UNSET(m, '_key', '_rev'),
        connected_to: UNSET(v, '_key', '_rev') 
    }
 

Он просто удаляет эти ключи из результатов, отправленных вам в запросе.

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