OreintDb Выберите запрос В операторном фильтре с подзапросом обхода, который не работает

#sql #orientdb #orientjs #orientdb3.0 #graph-query

Вопрос:

Я пытаюсь использовать запрос обхода в подзапросе, чтобы получить отфильтрованные данные для вершины, но не могу получить данные. Пожалуйста, ознакомьтесь с приведенными ниже шагами для настройки вершины

 CREATE CLASS Territory IF NOT EXISTS EXTENDS V
CREATE PROPERTY Territory.name IF NOT EXISTS STRING (MANDATORY TRUE)
CREATE PROPERTY Territory.subTerritories IF NOT EXISTS LINKLIST Territory

CREATE CLASS Customer IF NOT EXISTS EXTENDS V
CREATE PROPERTY Customer.CustomerNo IF NOT EXISTS STRING (MANDATORY TRUE, NOTNULL TRUE)
CREATE PROPERTY Customer.territories IF NOT EXISTS LINKLIST Territory
 

Вставка данных о вершинах клиентов
INSERT INTO CUSTOMER (CustomerNo, territories) VALUES ("Cust_1", []), ("Cust_2", []), ("Cust_3", [])

Вставка данных о вершинах территории INSERT INTO Territory (name, subTerritories) VALUES ("All Territories", []), ("United States", []), ("East Coast", []), ("West Coast", [])

Затем сначала обновите записи территорий, обновив значение свойства их подвалов, следуя приведенной ниже структуре

   All Territories 
    United States (sub territory of All territory)
        East Coast  (sub territory of United states) 
        West Coast  (sub territory of United states)
 

Обновляйте записи в соответствии со следующими сценариями

  1. Добавьте МПОГ Соединенных Штатов в список субтерриторий всех территорий
  2. Добавьте rid Восточного и Западного побережья в список субтерриторий записей Соединенных Штатов
  3. Добавьте rid территории Восточного побережья к 2 записям о клиентах собственность территорий и Территория Западного побережья к оставшейся единственной записи

Теперь в соответствии с нашим требованием

  • если клиенты отфильтрованы по идентификатору территории восточного побережья, то мы должны получить 2 клиента
  • если клиент отфильтрован по идентификатору территории Соединенных Штатов, то он должен возвращать данные клиентов как с восточного, так и с западного побережья

поэтому для получения списка rid территорий мы используем запрос на пересечение, например, если вы передадите rid территории Соединенных Штатов в приведенном ниже запросе, он вернет 3 записи в соответствии с приведенной выше настройкой данных, т. е. Синтаксис данных Соединенных Штатов, восточного побережья и западного побережья:
SELECT @rid FROM (TRAVERSE subTerritories FROM <UNITED_STATES_TERRITORY_RID>)
например
SELECT @rid FROM (TRAVERSE subTerritories FROM #23:0)

этот запрос нам нужно использовать в качестве подзапроса для фильтрации записей клиентов

Если мы попробуем обычный запрос клиента с оператором In и указанным идентификатором территории, то получим данные select * from клиента WHERE territories.@rid IN [#24:0]

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

Synatx
select * from : WHERE territories IN (SELECT @rid FROM (TRAVERSE subTerritories FROM <UNITED_STATES_TERRITORY_RID>))
клиент, например,
select * from клиент WHERE territories IN (SELECT @rid FROM (TRAVERSE subTerritories FROM #23:0))

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

есть какие-либо предложения по улучшению вышеуказанных подзапросов ?

Ответ №1:

Необходимо использовать методы SQL OrientDB ( asList() в данном случае) в подзапросе.

 SELECT FROM customer WHERE territories IN (SELECT @rid.asList() FROM (TRAVERSE subTerritories FROM [#65:0,#66:0]))