RDF中度量单位本体的实用性如何?

RDF中度量单位本体的实用性如何?,rdf,ontology,Rdf,Ontology,我正在用RDF创建一个材料集合。我遇到了两种处理度量单位的方法: 通过将描述性名称链接到RDF属性: prop:density prop:has单位为“kg/m3”。 a x:材料; 道具:密度“1676”` 使用现有的本体库,如。分配单元要复杂得多,因为它涉及到创建。请参见下面我如何为材质指定相同的密度: ax:物料; om:哈斯现象。 a om:密度; om:有价值。 a:度量; om:数值左值为1.676E3; om:hasUnit om:kg/立方米。 我已经回顾了不同的用例,但主要

我正在用RDF创建一个材料集合。我遇到了两种处理度量单位的方法:

  • 通过将描述性名称链接到RDF属性:
  • prop:density prop:has单位为“kg/m3”。
    a x:材料;
    道具:密度“1676”`
    
  • 使用现有的本体库,如。分配单元要复杂得多,因为它涉及到创建。请参见下面我如何为材质指定相同的密度:
  • ax:物料;
    om:哈斯现象。
    a om:密度;
    om:有价值。
    a:度量;
    om:数值左值为1.676E3;
    om:hasUnit om:kg/立方米。
    
    我已经回顾了不同的用例,但主要集中在它们可以做什么,而不是它们如何做以及它是否实用。例如,如果您只想返回指定材质属性的所有值,那么使用单元本体会使查询变得更加复杂。还有一些本体没有涵盖的属性,例如表面粗糙度,目前还不清楚如何扩展它们


    我更喜欢第一种方法。它更加干净、灵活,为用户提供了在典型数据库中无法获得的有用信息。我会尝试在应用程序端处理单位转换,因此我的首要任务是以查询友好的方式存储信息。我担心的是,通过采用这种方法,我将进一步限制功能。选择一种方法比另一种方法有什么主要的优点和缺点吗

    问题中提到的问题是RDF社区中的一个已知问题,已在同行评审的论文中讨论过

    关于问题中提到的第二种方法,人们可能会认为使用中间对象进行编写是完全不自然的。然而,描述事物测量的本体论可能是在考虑了几个方面之后编写的。例如,当某个对象在某个特定时刻膨胀时,可能需要中间对象来指定这些测量的时间。当然,有些情况下不需要这些附加说明

    第一种方法的问题是,它完全将
    prop:density
    限制为仅一个单位。如果密度采用不同的单位,则必须执行转换

    我认为在您的上下文中,一个简单的解决方案是引入特定的数据类型

    @prefix x:  <http://example.com/data> .
    @prefix o:   <http://example.com/ontology> .
    
    x:MyBrick a x:Material;
         o:density "1676"^^o:kg-m3.
    
    如上所示,已经定义了一个附加的数据类型
    o:kg-l
    。现在,使用相同的属性,可以指定以不同单位测量的密度。例如:

    @prefix x:  <http://example.com/data> .
    @prefix o:   <http://example.com/ontology> .
    
        x:MyBrick1 a x:Material;
             o:density "1676"^^o:kg-m3.
    
        x:MyBrick2 a x:Material;
             o:density "200"^^o:kg-l.
    
        x:MyBrick3 a x:Material;
             o:density "200a"^^o:kg-m3.
    
    @前缀x:。
    @前缀o:。
    x:MyBrick1 a x:Material;
    密度“1676”^^o:kg-m3。
    x:MyBrick2 a x:材料;
    密度为“200”^^o:kg-l。
    x:MyBrick3 a x:材料;
    密度“200a”^^o:kg-m3。
    
    如上所述,定义了三个
    x:Material
    实例及其各自的
    o:density
    。查看上面的三元组,您会注意到在最后一个三元组中,
    o:density
    的值是
    200a
    。您将同意该值不是格式良好的密度值。此外,您可能想知道哪些对象,
    x:MyBrick1
    x:MyBrick2
    ,具有较高的密度。一致的RDF三元组存储将无法识别最后一个三元组中的值格式不正确。同样,一致SPARQL引擎将无法对
    o:density
    值执行代数运算。然而,您可以定制RDF triplestore或SPARQL引擎的实现以满足这些需求。本文[1]介绍了如何实现这一点

  • 莱夫兰索瓦、马克西姆和安托万·齐默尔曼。“在RDF和SPARQL中支持任意自定义数据类型”,《欧洲语义网会议》。湛斯普林格,2016年。()

  • 这是一个有趣的选项概述。我认为使用cdt的定制数据类型:ucum是一种很好的方法;但是,我不清楚如何使用SPARQL来确定与返回的文本相关联的数据类型。例如,如果我的值为“0.842 kg/m3”^^^^或在您的情况下为o:kg-m3;除了返回数据类型为cdt:ucum或o:kg-m3的查询外,如何制定查询,以便处理器知道如何处理该值?@alkey,您可以在SPARQL 1.1中使用
    datatype
    函数。检查这个
    @prefix x:  <http://example.com/data> .
    @prefix o:   <http://example.com/ontology> .
    
    x:MyBrick a x:Material;
         o:density "1676"^^o:kg-m3.
    
    @prefix o:   <http://example.com/ontology> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    
    o:kg-m3 a rdfs:Datatype;
            rdfs:label "Kilogram per metric cube datatype (kg/)";
            rdfs:comment "A datatype to type densities measured in kilogram per meter cube" .
    
    o:kg-l a rdfs:Datatype;
            rdfs:label "Kilogram per liter datatype";
            rdfs:comment "A datatype to type densities measured in kilogram per liter cube" .
    
    @prefix x:  <http://example.com/data> .
    @prefix o:   <http://example.com/ontology> .
    
        x:MyBrick1 a x:Material;
             o:density "1676"^^o:kg-m3.
    
        x:MyBrick2 a x:Material;
             o:density "200"^^o:kg-l.
    
        x:MyBrick3 a x:Material;
             o:density "200a"^^o:kg-m3.