2017-02-25 36 views
0

我有一個SPARQL構造,工作原理是這樣的:條件在SPARQL綁定/ CONSTRUCT

CONSTRUCT { 
    ?uri rdfs:label ?label; 
     foo:has-value ?v.   
} 
WHERE { 
    ?uri 
    rdfs:label ?label; 
    foo:has-flag ?f. 

    BIND (IF (?f = 0, "Value for Zero", IF (?f = 1, "Value for One", '')) AS ?v) 
} 

,當?f既不是0也不是1(但仍具有一定的價值),我不想的問題是has-value聲明。通過上面的語法,我得到了?uri has-value ''。如果我可以爲?v指定某種「null」,或者避免綁定,但它會起作用,但在規範中我找不到任何類似的內容。

任何解決方案?

編輯solution by Scott適用於常見的基於圖形的查詢。我來自的案例涉及使用VALUES,is more complicated,到目前爲止我還找不到解決方案。

回答

2

鑑於該意見反饋,這裏是一個基於OPTIONAL的解決方案應當能夠滿足所有的條件:

CONSTRUCT { 
    ?uri rdfs:label ?label; 
     foo:has-value ?v.   
} 
WHERE { 
    ?uri rdfs:label ?label .  
    ?uri foo:has-flag ?f. 
    OPTIONAL { FILTER (?f = 0) 
     BIND("Value for Zero" AS ?v) 
    } 
    OPTIONAL { FILTER (?f = 1) 
     BIND("Value for One" AS ?v) 
    } 
} 

正如指出的那樣,這個以前的解決方案,其中存在的標籤,但?f將不包括的情況下不是0或1:

CONSTRUCT { 
    ?uri rdfs:label ?label; 
     foo:has-value ?v.   
} 
WHERE { 
    ?uri 
    rdfs:label ?label; 
    foo:has-flag ?f. 
    FILTER (?f = 0 || ?f = 1) 
    BIND (IF (?f = 0, "Value for Zero", IF (?f = 1, "Value for One", '')) AS ?v) 
} 
+0

對不起,沒有。這個函數總共跳過了?uri(s),而在這種情況下,我想僅省略has-value三元組(並保留rdfs:label或其他)。嘗試與可選,但不工作。 – zakmck

+0

好吧,它暴露了SPARQL'IF'中的一個明顯缺陷。如果SPRQL只允許'then'表達式,即不需要'else',那麼在原始查詢中它將是一個簡單的刪除操作。所有這些嘗試都只是爲了解決這個問題。 – scotthenninger

+0

是的,可選是我提出問題的方法。問題是我來自它的變體,涉及VALUES構造,似乎沒有解決方案:http://jena.markmail.org/search/#query:%20list%3Aorg.apache。 incubator.jena-dev + page:1 + mid:q3fp3ve3dgolc2cz + state:results – zakmck

1

有點哈克但應與創建空白節點工作,然後過濾掉那些:

CONSTRUCT { 
    ?uri rdfs:label ?label; 
     foo:has-value ?v.   
} 
WHERE { 
    ?uri rdfs:label ?label . 
    OPTIONAL { 
    ?uri foo:has-flag ?f. 

    BIND (IF (?f = 0, "Value for Zero", 
      IF (?f = 1, "Value for One", BNODE()) 
     ) AS ?v) 
    FILTER(!ISBLANK(?v)) 
    } 
} 
+0

看到我上面的評論,這跳過了沒有0/1的節點的任何三元組。 – zakmck

+0

然後將第二部分放入可選子句中? – AKSW