如何使用Cygnus在CKAN中存储复杂的上下文属性

时间:2016-09-06 14:20:53

标签: ckan fiware-cygnus

目前我已经配置了Fiware-Orion + Fiware-Cygnus + CKAN的解决方案。

我有以下问题:

上下文属性始终按类型,值和元数据存储;在行模式下,以及在列模式下。 但是,我在Context Broker中使用了更复杂的JSON结构(类型'T')

但是,大多数标准CKAN前端查看器无法处理JSON属性值。

有没有解决方案可以解决这个问题?

元数据存在类似的问题,目前由Cygnus在CKAN中按照定义存储为JSON。

最简单的解决方案是将上下文代理数据模型更改为使用平面数据类型。但是,我认为这是一个糟糕的解决方案,因为我不希望上下文建模受到存储适配器限制。

另一种解决方案是升级标准观众并编写新观众。 但是,以下是一个更通用的解决方案,允许我使用任何CKAN查看器。

假设我有一个名为myAttr且值为{ a: 1, b: 2, c: 3}的ContextElement属性。目前它将由CKAN Sink存储为:

行持久模式

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
...

意见表示赞赏。

1 个答案:

答案 0 :(得分: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}]。即,单个列中的所有元数据,不按照您的描述进行拆分。

您可以在readthedocs找到有关CKAN持久性的所有详细信息。

据说,我认为您的用例可以通过更改Orion的数据模型轻松修复。由于您似乎需要按“子值”分割单个值{ a: 1, b: 2, c: 3},即a: 1b: 2c: 3(同样适用于元数据),使用具有适当类型和元数据的3个属性。