[英]rdfs remove items if a condition happens
在上一個問題中
我問如果我有一個實例,該實例具有特定謂詞的值,那么我的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.
但是結果總是空的,我不知道為什么。
通過特定謂詞,我的意思是謂詞rdfs:subClassOf:isCriticalPredicate
通過特定的類,我的意思是rdfs:subClassOf:ImportantClass的類
如所寫,這是一個非常簡單的問題:實際上沒有與您編寫的查詢相匹配的數據。 因此,我認為數據和查詢不能真正重現您所描述的問題。 您的查詢始於
values ?x {:instance1}
?x ?predicate ?value.
?item ?predicate ?value.
filter (?x != ?item)
您的數據有:
:instance1 :p1 :value1.
:instance2 :p1 :value2.
實例沒有可能的值。 唯一的候選者將是: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 |
--------------
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.