4

こんにちは、AllegroGraph と 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 (Mannan Sathish) の名前は含まれません。バインドされていない場合、firstName を無視できるかどうか教えてください。

結果セット

4

1 に答える 1

9

変数がバインドされていない場合、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
于 2013-04-18T10:05:44.803 に答える