2

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

假设我使用生物医学研究本体 (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具有测量值。的范围<http://purl.obolibrary.org/obo/IAO_0000004>xsd:double。我知道我可以使用类似下面的查询来检查与指定范围不完全相同的数据类型。

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

是否有一个现有的本体说它xsd:int是 的子类xsd: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 )
}
4

4 回答 4

3

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

xsd:int 不是xsd:double. _

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

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

于 2017-09-22T21:30:49.417 回答
3

要回答您的问题:

所有整数都包含在双精度浮点数集中。(正确的?)

错误的!正如您所说,xsd:double包含一组双精度浮点数,其中不包含格雷厄姆数和其他大整数之类的数字。

是否有一个现有的本体说它xsd:int是 的子类xsd:double

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

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

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

于 2017-10-04T20:26:34.127 回答
1

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

于 2017-09-22T17:06:37.593 回答
1

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

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

于 2017-09-23T09:03:28.917 回答