目前,我已经使用Fiware-Orion + Fiware-Cygnus + CKAN配置了一个解决方案。
我有以下问题:
上下文属性始终按类型、值和元数据存储;在行模式中,与在列模式中一样好。但是,我在上下文代理中使用了更复杂的JSON结构(类型为'T')
但是,大多数标准的CKAN前端查看器不能处理JSON属性值。
有什么解决方案可以解决这个问题吗?
元数据也存在类似的问题,根据定义,元数据目前由Cygnus作为JSON存储在CKAN中。
最简单的解决方案是将上下文代理数据模型更改为使用平面数据类型。但是,我认为这是一个糟糕的解决方案,因为我不希望上下文建模受到存储适配器限制。
另一种解决方案是升级标准查看器并编写新的查看器。但是,下面是一个更通用的解决方案,它允许我使用任何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
...我很欣赏你的意见。
发布于 2016-09-13 17:44:06
首先,必须指出您描述“列”-like持久性的方式是不正确的。如果具有属性名称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: 1、b: 2和c: 3 (同样适用于元数据),因此只需使用3个具有适当类型和元数据的属性即可。
https://stackoverflow.com/questions/39351378
复制相似问题