假设我在 db 中有金属 Material ,其属性屈服强度可以从 300 到 500 MPa。我如何将其作为字面值输入。
我应该放置 2 个属性,如 YieldStrengthMin
和 YieldStrengthMax
,还是可以在单个条目中完成并格式化为 300 - 500 之类的东西。我知道我可以放置它像这样作为字符串类型,但我需要的是,当我对我的数据库进行 SPARQL 时,我应该进行查询以找到所有 Material ,比如 YieldStrength > 350
。如果它在那个区间内,即使是部分区间,它也应该是一个有效结果。
好的,再举一个例子来说明
我将拥有 Material 数据库,每种类型的 Material 都有许多属性。假设 prop:hasMeltingTemperature
。
material:ZA-12 prop:hasMeltingTemperature "380 - 430".
material:Zn prop:hasMeltingTemperature "420".
其中一些(清洁 Material )将具有相同的熔化温度,合金的温度将根据某些成分的百分比而变化。
我的应用程序必须从数据库中获取所有 Material ,假设熔化温度 > 400。因此在这种情况下,它应该同时获取这两种 Material 。
如果我询问我需要所有熔化温度 < 425 的 Material ,它也应该同时使用这两种 Material 。如果query < 400,那么只有第一个 Material 。
无论如何,我的问题是:
我应该像这样制作属性吗:
material:ZA-12 prop:hasMeltingTemperature_MIN "380".
material:ZA-12 prop:hasMeltingTemperature_MAX "430".
material:Zn prop:hasMeltingTemperature "420".
然后,当我查询时,我必须检测“>”,然后将其与“MIN”温度和“solo”温度进行比较,如果是“<”,则将其与“MAX”温度和“solo”温度进行比较。
在这种情况下,我必须首先检测 Material 是否只有“一个”或“最小-最大”温度或“无”温度属性。
或
我可以像第一个示例那样做,并且只有一个属性,例如:
material:ZA-12 prop:hasMeltingTemperature "380 - 430".
material:Zn prop:hasMeltingTemperature "420" .
并进行某种可以理解“间隔”并比较它们的 sparql 查询?
这就是我想知道的,因为 Material 有很多属性,很多 Material ,其中一些具有“最小最大”值,一些具有“单独”值,还有一些根本没有该属性,但有另一个有同样问题的...
我的应用程序将在 php 中,因此我将不得不在 php 中生成 sparql 查询,这就是为什么我一直在寻找某种“通用”类型的查询(仅检查一个属性)..
所以我的问题更多的是如何有效地 sparql 查询它,那 2 个存储数据的更好选择是什么,以及如何查询它'
最佳答案
这里有几种不同的意思。你可以
- 声明属性的范围是某个范围内的值;
- 断言对于某个特定个体,其特定属性的值在某个范围内;
鉴于你是这么说的:
what i need is that when i SPARQL my db, i should make query that will find all materials that have let's say YieldStrength > 350. If it's in that interval even partial it should be a valid result.
使用两个属性
我认为最好的办法是使用两个属性(例如 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
在 [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]
, 其中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 )
}
关于rdf - 如何将整数 "range"放入 OWL 文字值中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19916956/