如果条件发生,rdfs将删除项目

时间:2016-03-07 10:31:46

标签: sparql rdf semantic-web owl

在上一个问题中

SPARQL if an instance has a property, others must as well

我问过,如果我有一个具有特定谓词值的实例,那么我的sparql查询的所有输出必须具有相同谓词的相同值。

我在那里得到了很好的答案,

现在我正在尝试扩展它,因为我找到了一个新的场景,

新方案是:

如果实例具有特定谓词的值,则所有输出项必须具有相同谓词的相同值,或者如果它们具有其他值,则这两个值必须为来自同一个班级

我将sparql查询扩展到以下内容:

    PREFIX : <http://example.org/rs#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select ?item ?predicate ?similarity where 
{
  values ?x {:instance1}
  ?x ?predicate ?value.
  ?item ?predicate ?value.
  ?predicate :hasSimilarityValue ?similarity.
  filter (?x != ?item)
  filter not exists {
    ?x ?p ?v1.
    ?v1 a   ?class.
    ?p  rdfs:subPropertyOf  :isCriticalPredicate.
    filter not exists {
        ?item ?p ?v2.
        ?p rdfs:subPropertyOf :isCriticalPredicate.
        ?v2 a   ?class.
        ?class  rdfs:subClassOf :ImportantClass
    }
  }
}

这是我的数据:

  @prefix : <http://example.org/rs#>
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

:instance1  :p1 :value1.
:instance2  :p1 :value2.
:p1 :hasSimilarityValue 0.5.
:value1 a   :class1.
:value2 a   :class1.
:class1 rdfs:subClassOf :ImportantClass.
:p1 rdfs:subPropertyOf  :isCriticalPredicate.

但结果总是空的我不知道为什么。

备注1

通过特定谓词,我的意思是谓词rdfs:subClassOf:isCriticalPredicate

通过特定的类,我的意思是那个是rdfs的类:subClassOf:ImportantClass

1 个答案:

答案 0 :(得分:2)

即时问题:没有匹配的数据!

正如所写,这是一个非常简单的问题:实际上没有与您编写的查询相匹配的数据。因此,我不认为数据和查询真实地重现了您所描述的问题。您的查询以

开头
  values ?x {:instance1}
  ?x ?predicate ?value.
  ?item ?predicate ?value.
  filter (?x != ?item)

您的数据有:

:instance1  :p1 :value1.
:instance2  :p1 :value2.

?instance没有可能的值。唯一的候选者是:instance2,但它没有与instance1共同的任何值,因此没有?值的候选者。

您想要的查询

现在,尽管所写的问题确实没有你所描述的问题,但我认为我看到了你所问的问题。当您尝试为调试过程创建最少的数据时,应尝试包含所有相关案例。在这种情况下,您希望至少具有对于关键谓词具有相同值的实例,以及对于关键谓词具有不同值但两个值都很重要的实例。这是一些数据:

@prefix : <urn:ex:>

:instance1 :p :v1 .
:instance1 :q :v2 .

:instance2 :p :v1 . 
:instance2 :q :v2 .  #-- same value for :q

:instance3 :p :v1 .
:instance3 :q :v3 .  #-- different, but important, value for :q

:instance4 :p :v1 .
:instance4 :q :v4 .  #-- different, non-important, value for :q

:q a :CriticalPredicate .

:v2 a :ImportantValue .
:v3 a :ImportantValue .

鉴于您已经处理过的查询,我认为这个问题会比较清楚。它与你已经拥有的东西没什么不同。

prefix : <urn:ex:>

select distinct ?item where  {
  values ?x { :instance1 }
  ?x    ?predicate ?value .
  ?item ?predicate ?value .
  filter (?x != ?item)

  #-- Exclude any results where
  #-- ?x has a value ?v1 for a
  #-- critical predicate ?p...
  filter not exists {
    ?x ?p ?v1 .
    ?p a :CriticalPredicate .

    #-- ...unless either ?item has
    #-- the same value ?v1 for the
    #-- predicate ?p, or ?item has
    #-- another value ?v2 and both
    #-- ?v1 and ?v2 are
    #-- :ImportantValues.
    filter not exists {
      { ?item ?p ?v1 }
      union
      { ?item ?p ?v2 .
        :ImportantValue ^a ?v1, ?v2 . }
    }
  }
}
--------------
| item       |
==============
| :instance2 |
| :instance3 |
--------------