【问题标题】:do xsd datatypes for literals have subclasses?文字的 xsd 数据类型有子类吗?
【发布时间】:2018-03-04 06:41:41
【问题描述】:

我正在尝试在任何推理系统或三重存储提供的加载时验证之外设置一些轻量级的按需数据验证。我正在使用 GraphDB 8.3。

假设我使用 Ontology of Biomedical Investigations (OBI) http://purl.obolibrary.org/obo/obi.owl 加载以下三元组:

PREFIX : <http://example.com/>
PREFIX  xsd:  <http://www.w3.org/2001/XMLSchema#>
insert data {
    graph :data
    {
        :measurement1 a <http://purl.obolibrary.org/obo/IAO_0000032> ;
            <http://purl.obolibrary.org/obo/IAO_0000004> "100.1"^^xsd:double .
        :measurement2 a <http://purl.obolibrary.org/obo/IAO_0000032> ;
            <http://purl.obolibrary.org/obo/IAO_0000004> "100"^^xsd:int .
    }
}

这表示:measurement1:measurement2 具有测量值。 &lt;http://purl.obolibrary.org/obo/IAO_0000004&gt; 的范围是xsd:double。我知道我可以使用以下查询来检查与指定范围不完全相同的数据类型。

正如您在我的查询中嵌入的 cmets 中看到的那样,我想说 :measurement2 的值 "100"^^xsd:int 是可以接受的,因为所有整数都包含在双精度浮点数集中. (对吧?)

是否存在表明xsd:intxsd:double 的子类的现有本体?

PREFIX : <http://example.com/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
# loaded obi into http://example.com/ontology
select distinct ?stype ?p ?ptype ?propdom ?proprange ?otype ?odatatype where {
    {
        graph :data
        {
            ?s ?p ?o .
            bind (datatype(?o) as ?odatatype)
        }
        optional {
            graph <http://example.com/ontology> {
                values ?ptype {
                    owl:ObjectProperty owl:DatatypeProperty
                }
                ?p a ?ptype
            }
        }   
        optional {
            ?o a ?otype
        }   
        optional {
            ?s a ?stype
        }   
        optional {
            {
                graph <http://example.com/ontology> {
                    ?p rdfs:domain ?propdom
                }
            }   
        }
        optional {
            {
                graph <http://example.com/ontology> {
                    ?p rdfs:range ?proprange
                }
            }   
        }
    }
    minus
    {
        ?s rdf:type ?o 
    }
    #       minus
    #    {
    #        ?odatatype rdfs:subClassOf+ ?proprange
    #    }
    filter ( ?odatatype != ?proprange )
}

【问题讨论】:

标签: xsd sparql rdf owl graphdb


【解决方案1】:

如果有任何这样的本体,它们肯定是用户自定义设计的。我不知道任何与此相关的 W3C 标准。这个 (https://www.w3.org/TR/xmlschema-2/#built-in-datatypes) 图显示了从十进制“派生”的整数,尽管我不确定它在多大程度上可以用作 ersatz subClassOf 或任何类似的东西。

【讨论】:

  • 创建有用答案的提示,如果您要引用提问者的某些内容,请突出显示文本,然后按双引号图标。它将格式化文本,使其与您的答案分开。欢迎来到stackoverflow
  • 我喜欢那个插图。在这种情况下,也许我将不得不依赖三重存储的加载时间验证器。我会发布我的经验。
【解决方案2】:

XSD 数据类型没有子类。有派生类型:xsd:intxsd:integer的派生类型;它是 XSD 定义的功能。

xsd:int 不是xsd:double的派生类型。

数据类型中重要的是值:"100"^^xsd:int"100"^^xsd:double 是相同的值。 SHACL 可以表达这一点。

请参阅https://www.w3.org/TR/xpath-datamodel-3/#types-hierarchy 中的“原子类型”

【讨论】:

  • "100"^^xsd:int 和 "100"^^xsd:double 是相同的值。 SHACL 可以表达这一点。 >> 嗯,根据标准,这是真假。这是 XSD 标准的一个非常奇怪的事实。 xsd:intxsd:double 的值空间是不相交的,这意味着无论"100"^^xsd:int 表示什么值,它都应该不同于"100"^^xsd:double 表示的值。但是,xsd:intxsd:double 的值空间的描述表明它们都包含数字,如预期的那样(即,在示例中,数字 100)。
【解决方案3】:

在一定程度上,规范就是这样做的。例如:https://www.w3.org/TR/swbp-xsch-datatypes/#sec-values

但是,如果没有任何推理机来执行此操作,您将不得不在多个数据类型共有的间隔和值上复制数据类型推理。

【讨论】:

  • 从推理的角度来看(在 RDF、RDFS、OWL DL、OWL Full 语义中),规范做到了所有这些。 xsd:int 的值和xsd:double 的值是不相交的。但是,对于支持 XSD 推理或 OWL 的 RDF,所有xsd:ints 也是xsd:decimals 的情况是,在 OWL(但不是在 RDF(S) 中),rdfs:subClassOf 之间的关系xsd:intxsd:decimal 是隐含的。
【解决方案4】:

回答您的问题:

所有整数都包含在双精度浮点数集中。 (对吧?)

错了!正如你所说,xsd:double 包含一组双精度浮点数,其中不包含像格雷厄姆数和其他大整数这样的数字。

是否存在表明xsd:intxsd:double 的子事物的现有本体?

如果有(我怀疑有),它与 XSD 的规范不一致(见上面的评论)。

对此,我应该补充一点,XSD 将xsd:decimal 的值空间定义为与xsd:double 的值空间不相交。这意味着xsd:int 的值空间也与xsd:double 的值空间不相交。

一般来说,我建议您尽可能使用xsd:decimal 而不是xsd:doublexsd:double 表明,使用您的数据或本体的系统永远不可能处理比 xsd:double 更好的精度或更大的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多