rdfs 在条件发生时删除项目
rdfs remove items if a condition happens
在上一个问题中
我问过,如果我有一个具有特定谓词值的实例,那么我的 sparql 查询的所有输出必须具有相同谓词的相同值。
我在那里得到了很好的答案,
现在我正在尝试扩展它,因为我发现了一个新场景,
新场景是:
如果实例具有 特定谓词的值,则所有输出项必须对同一谓词具有相同的值,或者 如果它们具有另一个值,这两个值必须来自相同的 class
我将该 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
通过特定的 class,我的意思是 class 即 rdfs:subClassOf :ImportantClass
眼前的问题:没有匹配的数据!
正如所写,这是一个非常简单的问题:实际上没有与您编写的查询相匹配的数据。因此,我认为数据和查询并没有真正重现您所描述的问题。您的查询以
开头
values ?x {:instance1}
?x ?predicate ?value.
?item ?predicate ?value.
filter (?x != ?item)
您的数据有:
:instance1 :p1 :value1.
:instance2 :p1 :value2.
?instance 没有可能的值。唯一的候选者是 :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 .
考虑到您已经在处理的查询,我认为这个查询会相对清楚。和你已经得到的没有太大区别。
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 |
--------------
在上一个问题中
我问过,如果我有一个具有特定谓词值的实例,那么我的 sparql 查询的所有输出必须具有相同谓词的相同值。
我在那里得到了很好的答案,
现在我正在尝试扩展它,因为我发现了一个新场景,
新场景是:
如果实例具有 特定谓词的值,则所有输出项必须对同一谓词具有相同的值,或者 如果它们具有另一个值,这两个值必须来自相同的 class
我将该 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
通过特定的 class,我的意思是 class 即 rdfs:subClassOf :ImportantClass
眼前的问题:没有匹配的数据!
正如所写,这是一个非常简单的问题:实际上没有与您编写的查询相匹配的数据。因此,我认为数据和查询并没有真正重现您所描述的问题。您的查询以
开头 values ?x {:instance1}
?x ?predicate ?value.
?item ?predicate ?value.
filter (?x != ?item)
您的数据有:
:instance1 :p1 :value1.
:instance2 :p1 :value2.
?instance 没有可能的值。唯一的候选者是 :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 .
考虑到您已经在处理的查询,我认为这个查询会相对清楚。和你已经得到的没有太大区别。
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 |
--------------