Database 查询能否推断子类?

Database 查询能否推断子类?,database,sparql,rdf,rdfs,turtle-rdf,Database,Sparql,Rdf,Rdfs,Turtle Rdf,我有一组信息(当然不是全部显示): 我想查询价格低于400的Android手机 我的问题是: SELECT ?phone WHERE { ?phone s:OS ?system ?system rdfs:subClassOf s:Android ?phone s:price ?value } FILTER (?value < 400) 选择?电话在哪里{ ?电话s:OS?系统 ?系统rdfs:子类s:Andro

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

我想查询价格低于400的Android手机

我的问题是:

SELECT ?phone WHERE {
?phone     s:OS               ?system
?system    rdfs:subClassOf    s:Android
?phone     s:price            ?value
} FILTER (?value < 400)
选择?电话在哪里{
?电话s:OS?系统
?系统rdfs:子类s:Android
?手机s:价格?价值
}过滤器(?值<400)
根据我上面的查询,我是否需要包括
?系统rdfs:subassof s:Android
?或者我可以删除该行并将其上方的一行更改为:
?phone s:OS s:Android

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

为了说明为什么推断这样的事情甚至是危险的,请考虑<代码>:FAAF:MeimultStase。这将个人(

foaf:Group
)与其成员的类别链接在一起,使两者相等(即,作为该类别的成员意味着拥有特定类别,反之亦然)。然而,当
owl:Thing
显然是一个超类时,从
foaf:membershipClass ex:MyClass
推断类似于
foaf:membershipClass owl:Thing
的东西是危险的

处理这个问题有两种选择。在不修改本体的情况下,您只需将
s:OS
转换为
a
,然后就可以从
s:galaxyEdge6 a s:Marshmallow
推断
s:galaxyEdge6 a s:Android
。然而,我不喜欢这种方法,因为它离现实世界的“是”关系太远了,而且更难查询操作系统


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

试试看,如果这样做会发生什么?扰流板:它应该是空的,因为在您的数据中,图形模式是
?手机s:OS?系统?系统rdfs:subClassOf s:Android
,即从手机到Android的两条边作为OSAlso,您应该知道您使用的URI与class和individual.Hm相同?我不太清楚你的意思?在您的数据中,手机连接到一个连接到Android的操作系统。因此,SPARQL查询必须使用这种图形模式。只需执行
?手机s:OS:Android
与您的数据中的任何内容都不匹配。而且不可能推断。常见的推理规则是
xrdf:type C。C rdfs:subClassOf D=>X rdf:type D
-您的数据显然没有涵盖这一点。顺便说一下,您的问题包含一些错误/类型:
s:Marshmaloow
s:Anroid
,以及查询之外的筛选器。请尽可能使你的例子正确。
SELECT ?phone WHERE {
?phone     s:OS               ?system
?system    rdfs:subClassOf    s:Android
?phone     s:price            ?value
} FILTER (?value < 400)
s:Marshmallow    rdfs:subClassOf    s:Android