您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

SPARQL:返回指定或等效类满足的所有交点

SPARQL:返回指定或等效类满足的所有交点

首先,我认为您无法完全按照自己的意愿去做,但是我认为您可以做到相当接近。特别是,我认为您提到的最大约束将特别难以实现。以这种方式处理SPARQL中的事物通常很困难。尽管如此,我们可以看到我们能做什么。

用我们可以实际使用的一些样本数据来回答这类问题要容易得多。我也从简化问题开始,以便ABC只是A,B和C以及C,D和E的CDE的交集。目前还没有限制类(它们不会增加太多的复杂性,其实)。为了进行测试(能够确保我们的查询不会返回不需要的值),我还添加了类F和DEF。在Turtle序列化中查看数据也更加容易,因为它更接近于SPARQL模式语法。这是简化的本体:

@prefix :      <http://stackoverflow.com/q/22396095/1281433/intersections#> .
@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#> .

<http://stackoverflow.com/q/22396095/1281433/intersections>
        a       owl:Ontology .

:A      a       owl:Class .
:B      a       owl:Class .
:C      a       owl:Class .
:D      a       owl:Class .
:E      a       owl:Class .
:F      a       owl:Class .

:ABC    a                    owl:Class ;
        owl:equivalentClass  [ a                   owl:Class ;
                               owl:intersectionOf  ( :A :B :C )
                             ] .

:CDE    a                    owl:Class ;
        owl:equivalentClass  [ a                   owl:Class ;
                               owl:intersectionOf  ( :C :D :E )
                             ] .

:DEF    a                    owl:Class ;
        owl:equivalentClass  [ a                   owl:Class ;
                               owl:intersectionOf  ( :D :E :F )
                             ] .

对于每个相当于一个交集类的类,从类到每个相交的类都有一条路径。我们可以利用这一事实找到与包括A,B和C的交集等效的任何类:

prefix :      <http://stackoverflow.com/q/22396095/1281433/intersections#>
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#>

select distinct ?class where {
  ?class owl:equivalentClass/
         owl:intersectionOf/
         rdf:rest*/rdf:first :A, :B, :C .
}



---------
| class |
=========
| :ABC  |
---------

但是,找不到CDE,因为此查询正在询问具有 所有 指定值的东西。听起来,您想要的是询问至少具有某些指定值之一且没有非指定值的事物。您可能需要两次编写类列表,但是您可以这样做:

prefix :      <http://stackoverflow.com/q/22396095/1281433/intersections#>
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#>

select ?class ?i where {
  values ?i { :A :B :C :D :E }
  ?class owl:equivalentClass/
         owl:intersectionOf/
         rdf:rest*/rdf:first ?i .

  filter not exists { 
    ?class owl:equivalentClass/
           owl:intersectionOf/
           rdf:rest*/rdf:first ?j .
    filter( !(?j in (:A, :B, :C, :D, :E )) )
  }
}
order by ?class ?i



--------------
| class | i  |
==============
| :ABC  | :A |
| :ABC  | :B |
| :ABC  | :C |
| :CDE  | :C |
| :CDE  | :D |
| :CDE  | :E |
--------------

请注意,DEF不在结果中,因为尽管它确实具有D和E,但它的值也不是任何指定的类F。

由于我们筛选出了这是一个元素每个路口类 输入列表中,我们保证每个路口类,我们 保留唯一 的元素 在输入列表中。有了这样的措辞,我们实际上可以使查询更简单:

prefix :      <http://stackoverflow.com/q/22396095/1281433/intersections#>
prefix owl:   <http://www.w3.org/2002/07/owl#>
prefix rdf:   <http://www.w3.org/1999/02/22-rdf-Syntax-ns#>

select ?class ?i where {
  # find each ?class that's equivalent to an intersection
  ?class owl:equivalentClass/owl:intersectionOf ?list .

  # and grab the intersecting classes for the results
  ?list rdf:rest*/rdf:first ?i .

  # but filter out any ?class that has an intersecting
  # class that's not in the input list.
  filter not exists { 
    ?list rdf:rest*/rdf:first ?element .
    filter( !(?element in (:A, :B, :C, :D, :E )) )
  }
}



--------------
| class | i  |
==============
| :ABC  | :A |
| :ABC  | :B |
| :ABC  | :C |
| :CDE  | :C |
| :CDE  | :D |
| :CDE  | :E |
--------------

但是,这可能会效率较低,因为现在您要查找 每个 路口类别并过滤掉不合格的路口类别,而不是只查找 可能 可接受的路口类别,然后过滤掉一些路口类别。这可能有多重要,取决于您的实际数据。

我认为这可以回答您问题的主要部分。要使用限制的交叉点,您只需要注意所讨论的类之间的路径有些不同。您想要匹配owl:someValuesFrom列表元素的属性值,而不是匹配列表中的元素,因此路径需要一个finalowl:someValuesFrom

?class owl:equivalentClass/
       owl:intersectionOf/
       rdf:rest*/rdf:first/
       owl:someValuesFrom ?i .
其他 2022/1/1 18:26:16 有460人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶