将 JSON 架构中的数组映射到 OWL

Mapping an array in JSON Schema to OWL

我正在尝试将 JSON 架构中定义的数组映射到 OWL 2.

这是 JSON 架构的简单示例:

{
  "properties": {
    "nm_prop": { 
          "type": "array",
          "items": {"type": "number"} 
    } 

  } 
}

这是从上面生成的 OWL 代码 JSON 模式:

:nm_prop subPropertyOf owl:topObjectProperty
:nm_prop rdfs:domain :JS_id
:nm_prop rdfs:range OntoDT:OntoDT_110287

OntoDT:OntoDT_110287 是定义数组的 ontology。

问题是如何在OWL中定义数组的元素将是某种数据类型(例如,xsd:string或xsd:integer)??


根据 cmungall 的回复,我为上面的 JSON Schema 示例提出了一个新定义。

我的目标是将 JSON 模式映射到 OWL 以便以后在数据集成应用程序中使用。

使用原始问题的 JSON 模式示例和 cmungall 的解释,OWL 中模式的可能表示形式为:

:JS_id rdf:type owl:Class .

:array_integer rdfs:subClassOf OntoDT:OntoDT_110287 ,
  [ rdf:type owl:Restriction ;
    owl:onProperty OntoDT:OntoDT_0000405 ;
    owl:allValuesFrom  xsd:integer ] .

:nm_prop rdfs:subPropertyOf owl:topObjectProperty ;
         rdfs:domain :JS_id ;
         rdfs:range :array_integer .

其中:

还有一个新问题:这种写法是否正确,是否等同于示例中的 JSON 架构?

您可以通过多种方式将数组存储在 OWL 中。但是假设您明确想要一个数组结构(而不​​是链表,如 rdf:list),例如形式:

[e_0,e_1,..,e_n]

您可以将其表示为:

[] a my:Array ;
  my:length n;
  my:contains
   [
    a my:ArrayElement ;
      my:index 0 ;
      my:value e_0
   ],
   [
    a my:ArrayElement ;
      my:index 1 ;
      my:value e_1
   ],
   ...
   [
    a my:ArrayElement ;
      my:index n ;
      my:value e_n
   ] .

(假设 "my" 是为 Array、ArrayElement 和其他属性定义 类 的词汇表

然后您可以定义(为清楚起见,切换到曼彻斯特语法):

ArrayOfInts EquivalentTo Array and my:contains only (my:value some integer)

并断言你的数组属于这种类型。

您可以添加其他公理来声明 my:value 和 my:index 是函数式的。

但值得在这里停下来问问您更广泛的目标是什么。 OWL 不是一种用于表示和推理计算数据结构的好语言。一方面,OWL 提出了开放世界假设,并且为了对数据结构进行推理(例如出于验证目的),您通常需要封闭世界假设。但是,在某些情况下这可能符合您的用例,例如如果您想对有关程序或数据结构的不完整信息进行推理。但即便如此,可能还有其他更适合的逻辑分支。

通常情况下,当某些东西在计算机程序中建模为数组时,OWL 中会有更自然的非数组表示。例如,如果我们想要表示按比赛中的完赛位置排序的赛跑者列表,则更自然的做法是为每个赛跑者对完成比赛的事件以及时间进行建模,并在查询时派生数组.

我不知道您的确切用例,但希望这与您相关。