2015-10-12 51 views
1

如何根據變量是否被綁定來更改查詢公式?SPIN函數中的條件子查詢(SPARQL)

我調用魔法屬性是這樣的:

WHERE { 
    VALUES (?subj) { 
     ([my bound positional parameter value goes here...]) 
    } 
    ?subj :myMagicProperty ?result .  
} 

裏面的魔法屬性,我做了工會:

?result a :Rule . 
{ 
    ?result :someProp ?subj . 
} 
UNION 
{ 
    FILTER NOT EXISTS { 
     ?result :someProp ?anyValue . 
    } 
} 

換句話說,讓我所有的結果,其中:someProp是這樣的值:someProp未定義。

這是棘手的部分。如果?subj未被綁定(即,我在VALUES塊中將其設置爲UNDEF),則上述查詢將變爲無效並返回所有內容。

相反,我想檢查?subj是否被解除綁定。如果?subj不作承諾,應該:myMagicProperty返回結果如下:

FILTER NOT EXISTS { 
    ?result ?someProp ?anyValue . 
} 

我已經嘗試使用FILTERBOUND功能,但我無法弄清楚如何得到正確的行爲。 ?subj未綁定時,如何從我的查詢中刪除UNION條款之一?

更新

修訂第一個查詢添加VALUES塊。
添加缺少?result a :Rule .聲明。
更正?someProp:someProp

回答

1

首先我想確認你的意圖是什麼。我希望通過要求您回答以下可以在TopBraid Composer中運行的查詢來做到這一點。

SELECT * 
    WHERE { GRAPH <http://topbraid.org/examples/kennedys> { 
    VALUES (?property) {(kennedys:firstName) (kennedys:lastName) (UNDEF)} 
    { 
     FILTER(BOUND(?property)) 
     ?s ?property ?result . 
    } 
    UNION 
    { 
    FILTER(!BOUND(?property)) 
    BIND("not sure what you want to do in this case" AS ?result) 
    } 
    } 
} 

上面代碼中的代碼不同的是,我設置你的?在VALUES語句someProp的值,而要設置?SUBJ。

UNIONed子圖使用BOUND和!BOUND作爲警衛。

在進一步的幫助之前,我希望聽到您對您想要構建的查詢有更清晰的解釋。然後我可以告訴你將需要的魔法屬性。

這是這片您最初的帖子我需要了解更多:

這裏是棘手的部分。如果?subj是未綁定的(即,我將它設置爲VALUES塊中的UNDEF),則上述查詢將不起作用並返回所有內容。

相反,我想檢查是否?sub​​j是未綁定的。如果?SUBJ不作承諾,myMagicProperty應該只返回了以下結果:

FILTER NOT EXISTS { 
    ?result ?someProp ?anyValue . 
}* 

隨着someProp不確定,以及結果和anyValue,你到底在期待回來????你的這個子圖也沒有斷言,它會填充圖表,因此不會返回任何結果。


拉爾夫

+0

拉爾夫, 我更新的問題,我的魔法屬性定義添加一個任期從示例代碼丟失。這樣做的目的是,「給予一定的價值?SUBJ,所有規則的資源,找到具有rule.someProp == SUBJ OR rule.someProp == NULL(沒有定義的屬性)規則。如果輸入值?SUBJ爲空,返回只有rule.someProp == null的規則。「 – RMorrisey

+0

我試圖用類似「FILTER(綁定(?屬性))」,但我發現是什麼?屬性,都會因爲在同一塊它下面的語句的約束,所以也沒有篩選出結果的方式我希望他們。 – RMorrisey

1

的訣竅是,我需要使用一個變量不同比一個傳遞作爲參數做UNION。這樣,UNION操作不會導致未綁定的參數被綁定。在UNION之後,我可以使用FILTER來根據輸入參數控制結果。

SELECT ?result 
WHERE { 
    ?result a :Rule . 
    { 
     SELECT ?rule ?value ?anyValueMatch 
     WHERE { 
      { 
       ?rule :someProp ?value . 
       BIND (false AS ?anyValueMatch) . 
      } 
      UNION 
      { 
       FILTER NOT EXISTS { 
        ?rule :someProp ?any . 
       } . 
       BIND (true AS ?anyValueMatch) . 
      } . 
     } 
    } . 
    FILTER ((bound(?subj) && (?value = ?subj)) || (?anyValueMatch = true)) . 
} 
1

另一種方式做,這是COALESCE:???值= SUBJ'

​​

...這樣就避免了分選和過濾器簡單地只包括結果匹配,其中, ,如果該子句失敗,則!bound()子句確保沒有包含someProp屬性的匹配。