如何将整数“范围”放入 OWL 文字值中?

Posted

技术标签:

【中文标题】如何将整数“范围”放入 OWL 文字值中?【英文标题】:how to put integer "range" in OWL literal value? 【发布时间】:2013-11-23 21:08:03 【问题描述】:

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

我应该把YieldStrengthMinYieldStrengthMax 之类的两个属性放在一起,或者它可以在单个条目中完成并格式化为300 - 500 之类的东西。我知道我可以把它作为一个字符串类型,但是我需要的是,当我对我的数据库进行 SPARQL 查询时,我应该进行查询,以查找所有具有让我们说YieldStrength > 350 的材料。如果它在那个区间内,即使是部分的,它也应该是一个有效的结果。

好的,再举一个例子来说明

我将拥有材料数据库,每种材料都有许多属性。假设prop:hasMeltingTemperature

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

material:Zn    prop:hasMeltingTemperature    "420".

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

我的应用程序必须从 db 获取所有材料,假设熔化温度 > 400。所以在这种情况下,它应该同时获取它们。

如果我询问我需要所有熔化温度

无论如何,我的问题是:

我应该做这样的属性吗:

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

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

material:Zn    prop:hasMeltingTemperature     "420".

然后当我查询时,我必须检测“>”,然后将其与“MIN”温度和“solo”温度进行比较,如果是“

在这种情况下,我必须首先检测材料是否只有“一个”或“最小-最大”温度或“无”温度属性。

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

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

material:Zn    prop:hasMeltingTemperature "420" .

并进行某种可以理解“间隔”并比较它们的 sparql 查询?

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

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

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

【问题讨论】:

您的要求并不完全清楚。您是否在问:(a) 如何在本体中声明某些属性的值必须介于某些值之间(例如,hasStrength 100 可以,但hasStrength 250 不是,因为 range hasStrength 的值是 100–200?(b) 如何说某些 特定 金属的最小强度为 100,最大强度为 200?(c) 如何查询 i> 对于具有某种特殊强度的金属?所有这些都很容易做到,但在我们提供帮助之前,我们需要澄清您到底想做什么。 刚刚澄清了,我希望足够好 感谢您的澄清。我认为这两个属性的解决方案会更好地为你工作。我认为与其使用三个属性(例如x1 hasMinVal y1 ; hasMaxVal y2. x2 hasExactVal y3),不如将所有内容都视为一个范围,而不是使用hasExactVal,而是使用x2 hasMinVal y3 ; hasMaxVal y3,因为那样的话一切都是一致的。 非常感谢您的帮助! :) 会这样做! 这是一个查询(不是查询)——一个r就足够了! 【参考方案1】:

这里有几个不同的意思。你可以

    声明一个属性的范围是某个范围内的值; 断言对于某些特定个体,其特定属性的值在某个范围内;

既然你这么说:

我需要的是,当我使用 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 的 RDF 序列化

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

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

在 Protégé 中是这样的:

这实际上意味着虽然不是金属具有一定的强度范围,而是对于metal72 hasStrength x形式的任何三元组,x的值必须是int in范围[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 使用如下查询对其进行查询。它将返回任何具有hasStrength only int[&gt;=min,&lt;=max] 类型的?metal,其中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 ) 

【讨论】:

以上是关于如何将整数“范围”放入 OWL 文字值中?的主要内容,如果未能解决你的问题,请参考以下文章

如何按整数读取文件整数并将它们放入二维数组?

如何从 16 x 8 位 __m128i 值中提取 32 x 4 位整数

如何从 NSDictionary 中提取一个整数并将其放入一个整数中?

我们如何将整数变量放入任务字符串中?

RandomizedSearchCV 溢出错误:无法将“int”放入索引大小的整数中

为啥 08 在 Java 中不是有效的整数文字?