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

使用SPARQL查询RDF数据库中的多态性,sparql,rdf,Sparql,Rdf,我有一个关于RDF模式中多态性的问题 我创建了一个“手机”类: @前缀rdfs:。 @前缀架构:。 @前缀rdf:。 @前缀my:。 my:MobilePhone rdf:type rdfs:Class。 my:MobilePhone rdfs:schema:Product的子类。 my:MobilePhone rdfs:标签“MobilePhone”。 然后我执行了两个查询: PREFIX : <http://schema.org/> PREFIX my: <http://

我有一个关于RDF模式中多态性的问题

我创建了一个“手机”类:

@前缀rdfs:。
@前缀架构:。
@前缀rdf:。
@前缀my:。
my:MobilePhone rdf:type rdfs:Class。
my:MobilePhone rdfs:schema:Product的子类。
my:MobilePhone rdfs:标签“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 . 
      }
前缀:
前缀“我的”:
前缀rdf:
前缀rdfs:
选择?实例
在哪里{
例a:我的手机。
}

前缀:
前缀“我的”:
前缀rdf:
前缀rdfs:
选择?实例
在哪里{
?实例a:产品。
}
我希望第二个查询检索所有产品。甚至是“手机”产品。但那没有发生。我必须使用:

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 .
}
前缀:
前缀“我的”:
前缀rdf:
前缀rdfs:
选择?实例
在哪里{
?RDF类:子类*:产品。
?实例rdf:类型?类。
}

是否有人知道是否可以更新我的模式,以便搜索所有产品的第一个查询可以工作

可以通过“正向链接”来更新您的数据(而不是您的模式[或本体]),以提供所需的结果,也就是说,通过明确地包含以下语句,即每个实体都是
a my:MobilePhone
也是
a:Product

也可以使用“反向链接”来交付所需的结果;具体细节将因您的triple/quad store和其他软件而异。(”的解决方案使用
定义输入:推断
pragma来。)


这两个术语都可以被视为“推断”或“推理”,尽管通常的用法通常只适用于动态行为——在“反向链接”中的每个查询中都会发生这种行为,在“正向链接”中也会发生一次预查询(通常在数据加载期间)。

这是一种有点奇怪的表达方式。“正向链接”和“反向链接”都是推理的形式。从某种意义上说,你是对的。我通常不认为“查询静态数据”是“使用推理”,即使推理用于生成静态数据。根据我的经验,一般用法与我的想法一致。您的里程可能不同。。。可能还值得一提的是,这两个选项都不是“更新@Mayda的模式”。鉴于此处所述的广泛差异,它似乎是最可靠的、跨系统兼容的,选择是使用
rdfs:subassof*
SPARQL查询。Ted,在您的回答中,您混淆了正向链接和具体化。虽然使用正向链接实现物质化是相当普遍的,但情况并非如此。也可以通过反向链接来实现您的推断。这相当于缓存推论。如果推断数据的大小远远大于明确事实(例如,大几个数量级),则具体化是不可行的。
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 . 
      }
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 .
}