недопустимый тип аргумента при вызове функции ATTRIBUTES () в ArangoDB

Я сохранил свои данные в формате предоставления в AreangoDB, имя моей коллекции в DSP:

 "data": {
"1":   [ {"db_name": "DSP"}, {"rel": "2"} ], 
"2":   [ {"rel_name": "DataSource"}, {"tuple": "201"}, {"tuple": "202"}, {"tuple": "203"} ],
"201": [ {"src_id": "Pos201510070"}, {"src_name": "Postgres"}, {"password": "root"}, {"host": "localhost"}, {"created_date": "20151007"}, {"user_name": "postgres"}, {"src_type": "Structured"}, {"db_name": "postgres"}, {"port": "None"} ],
"202": [ {"src_id": "pos201510060"}, {"src_name": "Postgres"},{"password": "root"}, {"host": "localhost"}, {"created_date": "20151006"}, {"user_name": "postgres"}, {"src_type": "Structured"}, {"db_name": "DSP"}, {"port": "5432"} ],
"203": [ {"src_id": "pos201510060"}, {"src_name": "Postgres"}, {"password": "root"}, {"host": "localhost"}, {"created_date": "20151006"}, {"user_name": "postgres"},{"src_type": "Structured"},{"db_name": "maindb"},{"port": "5432"} ]
}

Я выполняю запрос с указанными выше данными в следующем формате:

  FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p) 
  FOR attribute IN attributes 
      LET key = ATTRIBUTES(attribute)[0] 
      LET value = attribute[key] 
      RETURN { subject: attribute, predicate: key, object: value }

Когда я отправляю свой запрос в ArangoDB, он возвращает ответ как:

    Warnings:

[1542], 'invalid argument type in call to function 'ATTRIBUTES()''
[1542], 'invalid argument type in call to function 'ATTRIBUTES()''
[1542], 'invalid argument type in call to function 'ATTRIBUTES()''
[1542], 'invalid argument type in call to function 'ATTRIBUTES()''

Result:

[
  {
    "subject": "data",
    "predicate": null,
    "object": null
  },
  {
    "subject": "_id",
    "predicate": null,
    "object": null
  },
  {
    "subject": "_rev",
    "predicate": null,
    "object": null
  },
  {
    "subject": "_key",
    "predicate": null,
    "object": null
  }
]

Скажите, пожалуйста, в чем проблема с этим запросом и почему ответ похож на приведенный выше .. Я работаю в ArangoDB-2.7.3-win64.

Спасибо


person Mrityunjay Singh    schedule 19.06.2016    source источник


Ответы (1)


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

FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p) 
  FOR attribute IN attributes 
      RETURN attribute

что дает мне:

[ 
  "data", 
  "_rev", 
  "_key", 
  "_id" 
]

Итак, давайте углубимся в следующий слой. Я думаю, вас интересуют только значения, представленные под ключом data, верно? поэтому мы выбираем p.data:

FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p.data) 
  FOR attribute IN attributes 
      RETURN attribute

который затем дает мне ключи для вашего следующего внутреннего массива:

[ 
  "203", 
  "202", 
  "201", 
  "2", 
  "1" 
]

Теперь мы исследуем, что мы находим прикрепленным к этим узлам:

FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p.data) 
  FOR oneAttribute IN attributes 
    LET keys = p.data[oneAttribute]
      RETURN keys

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

[
  [ 
    { 
      "src_id" : "pos201510060" 
    }, 
    { 
      "src_name" : "Postgres" 
    }, ...

Добавляем этот дополнительный FOR-цикл:

FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p.data) 
  FOR oneAttribute IN attributes 
    LET keys = p.data[oneAttribute]
    FOR key IN keys
      RETURN key

мы получаем самые внутренние объекты:

[ 
  { 
    "src_id" : "pos201510060" 
  }, 
  { 
    "src_name" : "Postgres" 
  }, 
  { 
    "password" : "root" 
  }, 
...

Вы хотели использовать функцию ATTRIBUTES, но у объектов есть только один член, поэтому мы можем получить доступ к [0]:

FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p.data) 
  FOR oneAttribute IN attributes 
    LET keys = p.data[oneAttribute]
    FOR key IN keys
      LET keyAttributes=ATTRIBUTES(key)
        RETURN keyAttributes

Это дает нам ключи объекта, по одному на каждый внутренний объект:

[ 
  [ 
    "src_id" 
  ], 
  [ 
    "src_name" 
  ], 

Мы проверяем, получаем ли мы теперь только объектные ключи самой внутренней структуры; мы выбираем имена переменных немного умнее, чем указано выше:

  FOR p IN NestedDSP
    LET attributes = ATTRIBUTES(p.data) 
    FOR oneAttribute IN attributes 
      LET pairs = p.data[oneAttribute]
      FOR onePair IN pairs
        LET pairKey=ATTRIBUTES(onePair)[0]
          RETURN pairKey

ДА:

[ 
  "src_id", 
  "src_name", 
  "password", 
  "host", 
    ...

Итак, теперь пришло время построить объект результатов так, как вы хотели:

  FOR p IN NestedDSP
    LET attributes = ATTRIBUTES(p.data) 
    FOR oneAttribute IN attributes 
      LET pairs = p.data[oneAttribute]
      FOR onePair IN pairs
        LET pairKey=ATTRIBUTES(onePair)[0]
          RETURN { subject: oneAttribute, predicate: pairKey, object: onePair[pairKey] }

subject - это номер, идентифицирующий самый внешний элемент, predicate - это ключ объекта, а object - его значение:

[ 
  { 
    "subject" : "203", 
    "predicate" : "src_id", 
    "object" : "pos201510060" 
  }, 
  { 
    "subject" : "203", 
    "predicate" : "src_name", 
    "object" : "Postgres" 
  }

Надеюсь, именно этого вы и хотели?

person dothebart    schedule 20.06.2016