使用SPARQL查询RDF数据库中的多态性

时间:2016-08-17 15:32:35

标签: sparql rdf

我对RDF架构中的多态性有疑问。

我创建了一个“MobilePhone”类:

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix my: <http://localhost/> .

my:MobilePhone rdf:type rdfs:Class .
my:MobilePhone rdfs:subClassOf schema:Product .
my:MobilePhone rdfs:label "MobilePhone" .

然后我执行了两个查询:

PREFIX : <http://schema.org/>
PREFIX my: <http://localhost/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?instance
WHERE {
    ?instance a my:MobilePhone . 
      }

PREFIX : <http://schema.org/>
PREFIX my: <http://localhost/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?instance
WHERE {
    ?instance a :Product . 
      }

我希望第二个查询检索所有产品。甚至是“MobilePhone”产品。但那并没有发生。我不得不使用:

PREFIX : <http://schema.org/>
PREFIX my: <http://localhost/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?instance
WHERE {
    ?class rdfs:subClassOf* :Product .
    ?instance rdf:type ?class .
}

有谁知道是否可以更新我的架构,以便搜索所有产品的第一个查询可以工作?

1 个答案:

答案 0 :(得分:3)

可以更新您的数据(而不是您的架构[或本体])以提供所需的结果,通过&#34;正向链接&#34; - 即明确包括a my:MobilePhone的每个实体也是a :Product的陈述。

也可以使用&#34;反向链接&#34;提供理想的结果;具体情况因您的三/四商店和其他软件而异。 (My employer的解决方案Virtuoso使用DEFINE input:inference pragma到activate an inference rule set for each query。)

这两个都可以被视为&#34;推理&#34;或者&#34;推理&#34;,尽管常见用法通常仅将这些术语应用于动态操作 - 这种情况发生在&#34;反向链接&#34;中的每个查询中,以及一次,预查询,通常在数据期间加载,&#34;正向链接&#34;。