0

我有一组信息(当然不是全部显示):

s:Marshmallow    rdfs:subClassOf    s:Android
s:galaxyEdge6    s:OS       s:Marshmallow;
                 s:price    350.
...

我想查询既是安卓又价格低于400的手机。

我的查询:

SELECT ?phone WHERE {
?phone     s:OS               ?system
?system    rdfs:subClassOf    s:Android
?phone     s:price            ?value
} FILTER (?value < 400)

根据我上面的查询,我需要包括?system rdfs:subClassOf s:Android吗?或者我可以删除该行并将其上方的行更改为:?phone s:OS s:Android

4

1 回答 1

0
s:Marshmallow    rdfs:subClassOf    s:Android

这意味着任何个人a s:Marshmallow也是a s:Android。您不使用a( rdf:type) 作为谓词,因此没有什么可推断的。

为了说明为什么推断这样的事情甚至应该是危险的,请考虑foaf:membershipClass。这将个人 ( foaf:Group) 与其成员的一个类别联系起来,使得两者是等价的(即,作为该组的成员推断具有特定类别,反之亦然)。然而,从, when显然是这里的超类之类的foaf:membershipClass ex:MyClass东西来推断是很危险的。foaf:membershipClass owl:Thingowl:Thing

你有两种选择来处理这个问题。无需修改本体,只需s:OS变成a,即可s:galaxyEdge6 a s:Android从推断s:galaxyEdge6 a s:Marshmallow。但是,我不喜欢这种方法,因为它离现实世界的“是”关系太远了,而且更难查询操作系统。

就个人而言,我会选择 SKOS 来建模操作系统的概念,即拥有s:Android a skos:Concepts:Marshmallow skos:broader s:Android. 但是,您很可能还需要 OWL 来指定s:OS <narrower>需要s:OS <broader>(无论如何您都必须在不使用 SKOS 的情况下这样做)。

于 2020-12-18T23:46:59.933 回答