Sparql 如果出现条件,RDF将删除项

Sparql 如果出现条件,RDF将删除项,sparql,rdf,semantic-web,owl,Sparql,Rdf,Semantic Web,Owl,在前一个问题中 我问,如果我有一个实例,它有一个特定谓词的值,那么sparql查询的所有输出都必须有相同谓词的相同值 我得到了一个很好的答案 现在我正在尝试扩展它,因为我发现了一个新的场景 新的情况是: 如果一个实例对一个特定谓词有一个值,那么所有输出项对于同一谓词必须具有相同的值,或者如果它们具有另一个值,则这两个值必须来自同一类 我将sparql查询扩展到以下内容: 前缀: 前缀rdfs: 选择?项目?谓词?相似性,其中 { 值?x{:instance1} ?x?谓词?值。 项目谓词值。

在前一个问题中

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

我得到了一个很好的答案

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

新的情况是:

如果一个实例对一个特定谓词有一个值,那么所有输出项对于同一谓词必须具有相同的值,或者如果它们具有另一个值,则这两个值必须来自同一类

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

前缀:
前缀rdfs:
选择?项目?谓词?相似性,其中
{
值?x{:instance1}
?x?谓词?值。
项目谓词值。
谓词:hasSimilarityValue?相似性。
过滤器(?x!=?项)
筛选器不存在{
?x?p?v1。
v1a级。
?p rdfs:subpertyof:isCriticalPredicate。
筛选器不存在{
?项目?p?v2。
?p rdfs:subpertyof:isCriticalPredicate。
?v2 a?级。
?RDF类:子类:重要类
}
}
}
这是我的数据:

  @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.
@前缀:
@前缀rdfs:
:instance1:p1:value1。
:实例2:p1:value2。
:p1:hasSimilarityValue 0.5。
:值1 a:class1。
:值2 a:class1。
:class1 rdfs:子类:ImportantClass。
:p1 rdfs:subpertyof:isCriticalPredicate。
但结果总是空的,我不知道为什么

注1 通过特定谓词,我指的是rdfs:Subassof:isCriticalPredicate的谓词

所谓特定类,我指的是rdfs:subassof:ImportantClass的类,直接的问题是:没有匹配的数据! 如前所述,这是一个非常简单的问题:实际上没有与您编写的查询匹配的数据。因此,我不认为数据和查询真的再现了您所描述的问题。您的查询以

  values ?x {:instance1}
  ?x ?predicate ?value.
  ?item ?predicate ?value.
  filter (?x != ?item)
您的数据包括:

:instance1  :p1 :value1.
:instance2  :p1 :value2.
例如,没有可能的值。唯一的候选者是:instance2,但它与:instance1没有任何相同的值,因此?value没有候选者

您想要的查询 现在,即使书面问题没有你所描述的问题,我想我明白你在问什么了。当您试图为调试过程创建最少的数据时,应尝试包含所有相关案例。在本例中,您希望至少有一个实例具有相同的临界谓词值,以及一个实例具有不同的临界谓词值,但这两个值都很重要。以下是一些数据:

@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 .
眼前的问题是:没有匹配的数据! 如前所述,这是一个非常简单的问题:实际上没有与您编写的查询匹配的数据。因此,我不认为数据和查询真的再现了您所描述的问题。您的查询以

  values ?x {:instance1}
  ?x ?predicate ?value.
  ?item ?predicate ?value.
  filter (?x != ?item)
您的数据包括:

:instance1  :p1 :value1.
:instance2  :p1 :value2.
例如,没有可能的值。唯一的候选者是:instance2,但它与:instance1没有任何相同的值,因此?value没有候选者

您想要的查询 现在,即使书面问题没有你所描述的问题,我想我明白你在问什么了。当您试图为调试过程创建最少的数据时,应尝试包含所有相关案例。在本例中,您希望至少有一个实例具有相同的临界谓词值,以及一个实例具有不同的临界谓词值,但这两个值都很重要。以下是一些数据:

@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 .

注意
:isCriticalPredicate.
结尾的
可能很重要,因为像
:foo.bar
这样的东西是合法的。确保在
:isCriticalPredicate
之间有空格“通过特定类,我指的是属于rdfs:subassof:ImportantClass的类”您之前没有提到“特定类”;你说“如果它们有另一个值,这两个值必须来自同一个类”,你到底想要哪个?它们必须是来自同一类的值,或者它们都必须是来自ImportantClass的值?您的查询以:
?x?谓词?值开始?项谓词?值。`。在相同的数据中,instance1和instance2没有任何相同的值,因此查询的这部分永远不匹配。没有任何结果可获得。请小心
:isCriticalPredicate。
结尾的
可能很重要,因为像
:foo.bar
这样的东西是合法的。确保在
:isCriticalPredicate
之间有空格“通过特定类,我指的是属于rdfs:subassof:ImportantClass的类”您之前没有提到“特定类”;你说“如果它们有另一个值,这两个值必须来自同一个类”,你到底想要哪个?它们必须是来自同一类的值,或者它们都必须是来自ImportantClass的值?您的查询以:
?x?谓词?值开始?项谓词?值。`。在相同的数据中,instance1和instance2没有任何相同的值,因此查询的这部分永远不匹配。没有任何结果。您好,谢谢您的完整回答,我注意到我在提供数据时犯了错误,我忘了在问题上更正。对不起。我正在试图理解这个查询,请问您所说的
^a
是什么意思,这是我第一次看到它,它只是一个向后的属性路径。在sparql和turtle中,可以使用“a”代替rdf:type。“X^p Y,Z.”只是“Y rdf:type X.Z rdf:type X”的简写。省去了一点输入。您好,谢谢您的完整答案,我注意到我在提供数据时出错了,我忘了在问题上更正它。对不起。我正在努力