2016-09-06 1 views
1

В настоящее время я настроил решение с помощью Fiware-Orion + Fiware-Cygnus + CKAN.Как хранить сложные атрибуты контекста в CKAN с помощью Cygnus

У меня следующий вопрос:

атрибуты контекста всегда хранятся по типу, стоимости и метаданных; в режиме строки, также как и в режиме столбцов. Однако я использую более сложные структуры JSON в Контекст-брокере (тип 'T')

Однако большинство стандартных наблюдателей CKAN не могут обрабатывать значения атрибута JSON.

Есть ли решение для решения проблемы?

Аналогичная проблема существует для метаданных, которые в настоящее время хранятся Cygnus в CKAN как JSON по определению.

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

Другим решением будет обновление стандартных зрителей и создание новых. Однако, это более общее решение, которое позволяет мне использовать любой CKAN-просмотрщик.

Предположим, у меня есть атрибут ContextElement с именем myAttr и значением { a: 1, b: 2, c: 3}. В настоящее время он будет храниться в CKAN Раковина как:

Режим строки сохранение

attrName: "myAttr" 
attrValue: "{ a: 1, b: 2, c: 3}" 
attrMd: "[{name: md1_name, type: md1_type, value: md1_value}, {name: md2_name, type: md2_type, value: md2_value}]" 

Колонка Режим настойчивость:

column: myAttr 
value: { a: 1, b: 2, c: 3} 
column: myAttr_md 
value [{name: md1_name, type: md1_type, value: md1_value}, {name: md2_name, type: md2_type, value: md2_value}] 

Для того, чтобы решить эту проблему, я предложить следующую структуру:

Режим сохранения строки:

attrName: myAttr_a 
attrType: primitive myAttr.a type 
attrValue: 1 
attrName: myAttr_b 
attrType: primitive myAttr.b type 
attrValue: 2 
attrName: myAttr_c 
attrType: <primitive myAttr.b type> 
attrValue: 3 
attrName: myAttr_md_md1_name 
attrType: md1_type 
attrValue: md1_value 
attrName: myAttr_md_md2_name 
attrType: md2_type 
attrValue: md2_value 
... 

Мнения оценены.

ответ

0

Прежде всего, нужно сказать, что вы неправильно описываете «стойкость» столбца. Имея имя атрибута myAttr, значение атрибута { a: 1, b: 2, c: 3} и метаданных атрибут [{name: md1_name, type: md1_type, value: md1_value}, {name: md2_name, type: md2_type, value: md2_value}], то только две колонки, сохраняются:

  • Первый столбец с именем myAttr со значением { a: 1, b: 2, c: 3}
  • И второй колонке под названием myAttr_md со значением [{name: md1_name, type: md1_type, value: md1_value}, {name: md2_name, type: md2_type, value: md2_value}]. I.e., все метаданные в одном столбце, не разбитые, как вы описали.

Вы можете найти все сведения о сохранении CKAN по адресу readthedocs.

Будучи сказанным, я думаю, что ваш случай использования можно легко устранить, изменив вашу модель данных в Orion. Так как вам кажется, что вам нужно разомкнутое значение { a: 1, b: 2, c: 3} на «суб-значение», т. Е.a: 1, b: 2 и c: 3 (то же самое относится к метаданным), просто используйте 3 атрибута с подходящим типом и метаданными.

+1

Хотя это совсем не важно для обсуждения, я исправил описание стойкости столбца. Тем не менее, я, конечно, не хочу менять мою модель данных Orion только ради того, чтобы иметь достойный исторический набор данных в CKAN. В любом случае, я не могу сделать это для метаданных, так как в режиме столбца и в режиме строки метаданные будут представлены как структура JSON в CKAN. В настоящее время нет способа иметь значения метаданных в отдельном столбце CKAN. –

+0

Я внедрил свое предложение, в том числе тесты на прочность, и многие другие улучшения кода на https://github.com/rianwouters/fiware-cygnus/tree/feature/CKAN_structured_attributes –

+0

Я проверю код;) В любом случае, подумайте немного больше о своем Я думаю, что вы всегда считаете, что тип полей объекта, относящихся к уведомленному значению атрибута, является примитивным. Я говорю об этом из-за вашего предложения: 'attrType: primitive myAttr.a type' ... Но вы могли бы быть уведомлены с помощью' {"a": {"b": "1", "c": "2" }, "d": "3"} '(и очень сложные вещи); в этом случае тип 'a' не примитивен, а объект Json, поэтому вы можете быть в том же оригинальном сценарии :) – frb