SPARQL 查询 return 匹配满足的限制

SPARQL query to return matches on satisfied restrictions

我正在尝试对定义了限制的 class 编写查询,这将确定是否满足限制,如果满足,return。

一个例子class定义如下:

:ThingB  a            owl:Class ;
    rdfs:subClassOf   :ThingA ;
    rdfs:subClassOf   [ a                  owl:Restriction ;
                        owl:allValuesFrom  [ a                   owl:Class ;
                                             owl:intersectionOf  ( :ThingC :ThingD )
                                           ] ;
                        owl:onProperty     owl:isConfirmedBy
                      ] ;
    rdfs:subClassOf   [ a                   owl:Restriction ;
                        owl:onProperty      owl:isConfirmedBy ;
                        owl:someValuesFrom  [ a            owl:Class ;
                                              owl:unionOf  ( :ThingE :ThingF :ThingG :ThingH )
                                            ]
                      ] .

我希望能够编写一个查询,说明如果我同时拥有 ThingC 和 ThingD 以及 ThingE、ThingF、ThingG 或 ThingH 中的任何一个,那么 return ThingB。

只有当我同时拥有 ThingC 和 ThingD 时,以下查询才会执行第一部分,即 return ThingB:

SELECT 
*
WHERE
{
    ?thing rdfs:subClassOf ?restriction .
    ?restriction (owl:allValuesFrom | owl:someValuesFrom)/(owl:intersectionOf | owl:unionOf) ?list .

    FILTER NOT EXISTS { 
        ?list rdf:rest*/rdf:first ?things.
        FILTER( !(?things in (:ThingC, :ThingD )) )
    }
}

我如何包含限制的第二部分,即必须至少有一个 ThingE、ThingF、ThingG 或 ThingH 才能 return 匹配 ThingB?

您可以做一些您正在谈论的事情,但重要的是要记住 OWL 是基于开放世界的推理。这意味着如果你没有明确地说出某事,并且你没有办法推断它是对还是错,OWL 不会假设任何一种方式;它只是未知的。例如,如果你只说 "John loves Mary",那么你还没有说 "John loves Sue"(显然),但你也没有说 "John does not love Sue."

例如,您可以这样说:"Man ⊑ ∀ owns.Hat" ("Men own only hats.")。现在,这不是一个定义,所以你不能仅仅因为某物只有帽子就说它是一个男人。你可以发现一些违规行为,如果你能找到声称是男人但拥有的东西不是帽子。 (当然,找到绝对不是帽子的东西需要一些推理,因为在开放世界的假设下,通常很难知道什么是 不是 比知道它是什么 .)

综上所述,您 可以 使用 ontology 和 SPARQL 做一些事情。让我们先重新创建一些数据:

@prefix :      < .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@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#> .

:       a       owl:Ontology .
:A      a       owl:Class .
:C      a       owl:Class .
:D      a       owl:Class .
:E      a       owl:Class .
:F      a       owl:Class .
:G      a       owl:Class .
:H      a       owl:Class .

:isConfirmedBy  a  owl:ObjectProperty .

:B      a                owl:Class ;
        rdfs:subClassOf  :A ;
        rdfs:subClassOf  [ a                   owl:Restriction ;
                           owl:onProperty      :isConfirmedBy ;
                           owl:someValuesFrom  [ a                   owl:Class ;
                                                 owl:intersectionOf  ( :E :F :G :H )
                                               ]
                         ] ;
        rdfs:subClassOf  [ a                  owl:Restriction ;
                           owl:allValuesFrom  [ a                   owl:Class ;
                                                owl:intersectionOf  ( :C :D )
                                              ] ;
                           owl:onProperty     :isConfirmedBy
                         ] .

首先,让我们看看如何找到(可能的)违规行为。如果您发现自称是 Man 的东西得到非 C 和 D 的确认,或者未得到 E、F、G 或 H 的确认,您可能会发现违规行为。再次,我必须强调这很难,因为通常情况下你会说这样的话:

B ⊑ ∀ isConfirmedBy.(C ⊓ D)
β : B
isConfirmedBy(β,x)

这并不矛盾,即使您不知道 x 是 C 而 x 是 D。相反,您可以推断

x : (C ⊓ D)

然后从中你可以推断出:

x : C
x : D

因此,基于:

I am trying to write a query on a class with a restriction defined on it, that will determine whether the restriction has been satisfied and, if it has, return it.

听起来您要查询 return 候选 B 的实例。这些 到目前为止我们知道不违反会员的消极条件,满足会员的积极条件。在这种情况下,您会寻找以下内容:

  1. 没有被任何不是 C 和 D 的东西证实
  2. 被某些东西证实 E、F、G 或 H。

你可以这样写:

select ?candidate where {
  #-- find candidates that are confirmed by
  #-- by something that's an E, F, G, or H.
  values ?type { :E :F :G :H }
  ?candidate :isConfirmedBy/rdf:type ?type

  #-- But remove any that are confirmed by 
  #-- by something that's is *not* both a C
  #-- and a D.
  filter exists {
    ?candidate :isConfirmedBy ?x
    filter not exists { ?x a :C, :D }
  }
}

请注意,这不能确保每个候选人实际上都是 B,因为仍然有一些事情 可能我们还不知道的候选人。

我没有你的ontology,但是有了我自己的编造版本,我想出了以下策略。如果我理解正确的话,ThingC 和 ThingD 的存在是必不可少的,而且 ThingE、ThingF 或 ThingG 必须存在之一。所以基本上我认为你需要三个查询的交集。

SELECT distinct * 
Where {
{?thing rdfs:subClassOf ?restriction .
?restriction (owl:allValuesFrom | owl:someValuesFrom)/(owl:intersectionOf | owl:unionOf) ?list .
 FILTER EXISTS { 
    ?list rdf:rest*/rdf:first ?things.
    FILTER( (?things in (:ThingE, :ThingF,  :ThingG)) )
}}
{
?thing rdfs:subClassOf ?restriction .
?restriction (owl:allValuesFrom | owl:someValuesFrom)/(owl:intersectionOf | owl:unionOf) ?list .
FILTER  EXISTS { 
    ?list rdf:rest*/rdf:first ?things.
    FILTER( (?things in (:ThingD)) )
}}
{
?thing rdfs:subClassOf ?restriction .
?restriction (owl:allValuesFrom | owl:someValuesFrom)/(owl:intersectionOf | owl:unionOf) ?list .
FILTER  EXISTS { 
    ?list rdf:rest*/rdf:first ?things.
    FILTER( (?things in (:ThingC)) )
}}
}

我仍然不确定,当用 ThingB subClassOf hasRestriciton some ThingCThingB subClassOf hasRestriciton some ThingD 等公理定义 类 时,是否应该是您正在寻找的答案的一部分。在这种情况下,它不会出现。