2013-04-18 72 views
3

您好使用AllegroGraph和Sparql查詢來檢索結果。這是一個重現我的問題的示例數據。 考慮以下數據,其中一個人有姓,名和中間名。Sparql - 串聯失敗,如果任何一個變量未綁定

<http://mydomain.com/person1> <http://mydomain.com/firstName> "John"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> 
<http://mydomain.com/person1> <http://mydomain.com/middleName> "Paul"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> 
<http://mydomain.com/person1> <http://mydomain.com/lastName> "Jai"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> 
<http://mydomain.com/person1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://mydomain.com/person> 

<http://mydomain.com/person6> <http://mydomain.com/middleName> "Mannan"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> 
<http://mydomain.com/person6> <http://mydomain.com/lastName> "Sathish"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> 
<http://mydomain.com/person6> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://mydomain.com/person> 

現在我需要通過結合所有3個名字來計算人名。名字是可選的,並且一個人可能沒有任何名字,中間名和姓氏。

查詢我試圖

select ?person ?name ?firstName ?middleName ?lastName where 
{ 
    ?person rdf:type <http://mydomain.com/person>. 
    optional {?person <http://mydomain.com/firstName> ?firstName}. 
    optional {?person <http://mydomain.com/middleName> ?middleName}. 
    optional {?person <http://mydomain.com/lastName> ?lastName}.  
    bind (concat(str(?firstName),str(?middleName),str(?lastName)) as ?name). 
} 

但結果集不包含person6名稱(甘露Sathish所在),因爲第一個名字是不存在的。請讓我知道如果我沒有綁定,我可以忽略firstName。

Result set

回答

6

如果一個變量沒有被綁定,然後STR(...)將導致評估錯誤,整個BIND失敗。

COALESCE可用於給表達式提供默認值。

bind (COALESCE(?firstName, "") As ?firstName1) 
bind (COALESCE(?middleName, "") As ?middleName1) 
bind (COALESCE(?lastName, "") As ?lastName1) 
bind (concat(str(?firstName1),str(?middleName1),str(?lastName1)) as ?name 
+0

謝謝,它工作真棒! –