如何在OWL字面值中放置整数“范围”?

时间:2013-11-11 22:10:27

标签: rdf sparql semantics literals owl

假设我在db中有金属材料,其性能屈服强度可以从300到500 MPa。我怎样才能将其作为字面值输入。

我应该放置2个属性,如YieldStrengthMinYieldStrengthMax,或者它可以在单个条目中完成并格式化为300 - 500.我知道我可以把它作为字符串类型,但我需要的是,当我SPARQL我的数据库,我应该进行查询,找到所有材料,让我们说YieldStrength > 350。如果它在该区间内甚至是部分区域,那么它应该是有效的结果。

好的,另一个澄清的例子

我将拥有db材料,每种材质都有很多属性。我们说prop:hasMeltingTemperature

material:ZA-12 prop:hasMeltingTemperature    "380 - 430".

material:Zn    prop:hasMeltingTemperature    "420".

其中一些(清洁材料)将具有一个熔化温度,合金的温度将根据某些组分的百分比而变化。

我的应用程序必须从db获取所有材料,让我们说熔化温度> 400.所以在这种情况下它应该得到它们两个。

如果我查询我需要所有具有熔化温度的材料< 425它也应该同时兼顾它们。如果查询是< 400,然后只有第一种材料。

无论如何,我的问题是:

我应该制作这样的房产:

material:ZA-12 prop:hasMeltingTemperature_MIN "380".

material:ZA-12 prop:hasMeltingTemperature_MAX "430".

material:Zn    prop:hasMeltingTemperature     "420".

然后当我查询时我必须检测“>”然后将它与“MIN”temp和“solo”temp进行比较,如果它是“<”然后将它与“MAX”temp和“solo”temp进行比较。

在这种情况下,我必须首先检测材料是否只有“one”或“min-max”temp或“none”temp属性。

OR

我可以像第一个例子中那样做,并且只有一个属性,如:

material:ZA-12 prop:hasMeltingTemperature "380 - 430".

material:Zn    prop:hasMeltingTemperature "420" .

并制作一些可以理解“间隔”并进行比较的sparql查询?

这就是我想知道的,因为有很多材料的属性和许多材料,其中一些具有“最大值”值,一些“独奏”值,有些根本没有该属性,但有另一个有同样问题的人......

我的应用程序将在php中,所以我将不得不在php中生成sparql查询,这就是为什么我正在寻找一些“通用”类型的查询(只检查一个属性)..

所以我的问题是如何有效地sparql查询它,更好的选择2用于存储数据,以及如何查询它'

1 个答案:

答案 0 :(得分:6)

你可以在这里指出一些不同的东西。你可以

  1. 声明属性的范围是某个范围内的值;
  2. 断言,对于某些特定的个人,其特定属性的值在某个范围内;
  3. 鉴于你这么说:

      

    我需要的是,当我的SPARQL我的数据库时,我应该进行查询   找到所有材料,让我们说YieldStrength> 350.如果它在   该间隔甚至部分应该是有效的结果。

    使用两个属性

    我认为您最好的方法是使用两个属性(例如minStrength / maxStrength)。这意味着您可以拥有以下数据:

    metal72 minStrength 200 ;
            maxStrength 400 .
    

    然后您可以使用类似

    的模式编写查询
    ?metal minStrength ?min ;
           maxStrength ?max .
    filter( ?min <= 350 && 350 <= ?max )
    

    我认为这与您尝试捕获的想法最为匹配,因为听起来每个金属实际上与某些范围值相关联。如果某些金属可以具有精确值(而不是范围),您仍然可以通过输入数据来使用此方法:

    Zn minStrength 420 ;
       maxStrength 420 .
    

    然后所有的金属都是一致的(他们所有都有最小值和最大值),您的查询不必担心不同的情况。

    使用范围,并查询OWL的

    现在,虽然我认为之前的方法更有意义,但可以表示OWL中的数据范围。例如,如果存在hasStrength属性,您可以说某些金属仅在某个范围内具有强度,使用类似

    的限制
    metal72 a (hasStrength only int[>=200,<=400])
    

    在Protégé中,这看起来像:

    restriction in Protege

    这实际上意味着什么虽然不是金属具有一定的强度范围,但对于metal72 hasStrength x形式的任何三元组,x的值必须是int范围内的[200,400],否则数据不一致。这明显不同于说金属具有强度范围。

    OWL本体可以在RDF中序列化,然后您可以使用SPARQL查询RDF。你需要知道RDF的样子。在这种情况下,它是:

    :metal72  a     owl:NamedIndividual , :Metal ;
            a       [ a                  owl:Restriction ;
                      owl:allValuesFrom  [ a                     rdfs:Datatype ;
                                           owl:onDatatype        xsd:int ;
                                           owl:withRestrictions  ( [ xsd:minInclusive
                                                             200 ] [ xsd:maxInclusive
                                                             400 ] )
                                         ] ;
                      owl:onProperty     :hasStrength
                    ] .
    

    这有点多,但您可以使用SPARQL查询它,并使用如下查询。它将返回?metal类型为hasStrength only int[>=min,<=max]的{​​{1}},其中min ≤ 350 ≤ max

    prefix metal: <http://www.example.org/metal#>
    prefix owl:   <http://www.w3.org/2002/07/owl#>
    prefix xsd:   <http://www.w3.org/2001/XMLSchema#>
    prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    
    select ?metal where { 
      ?metal a metal:Metal ;
             a [ owl:allValuesFrom [ owl:withRestrictions [ rdf:rest* [ xsd:minInclusive ?min ] ] ;
                                                          [ rdf:rest* [ xsd:maxInclusive ?max ] ] ] ;
                 owl:onProperty metal:hasStrength ] .
      filter( ?min <= 350 && 350 <= ?max ) 
    }