簡體   English   中英

如果情況發生,rdfs刪除項目

[英]rdfs remove items if a condition happens

在上一個問題中

如果實例具有屬性,則SPARQL其他實例也必須

我問如果我有一個實例,該實例具有特定謂詞的值,那么我的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的類

眼前的問題:沒有匹配的數據!

如所寫,這是一個非常簡單的問題:實際上沒有與您編寫的查詢相匹配的數據。 因此,我認為數據和查詢不能真正重現您所描述的問題。 您的查詢始於

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM