2017-01-28 13 views
3

私はテーブルにすべての値を与えるSELECTを書こうとしています。私はオプションの値を持っています、もしそれらが存在しなければ、標準値で満たされるようにします。SPARQLは欠落しているフィールドの値を返します

これは私のコードです:

SELECT * WHERE { 
?a nmo:hasObject nm:coin 
OPTIONAL 
{ ?a nmo:hasAuthority ?b } 
OPTIONAL 
{ ?a nmo:hasMaterial ?c }} 

私はIDを、次の何を得る:私が欲しいもの

?a ?b ?c 
1 yx 
2  ab 
3 xz bc 

は値がない場合は、「行方不明」文字列でそれを埋めることです。

?a ?b  ?c 
1 yx  "missing" 
2 "missing" ab 
3 xz   bc 

この出力を得るためのSELECT構造のアイデアはありますか?

SELECT * WHERE 
    { ?a nmo:hasObject nm:coin 
    OPTIONAL 
     { ?a nmo:hasAuthority ?b_tmp } 
    OPTIONAL 
     { ?a nmo:hasMaterial ?c_tmp } 
    BIND(if(bound(?b_tmp), ?b_tmp, "missing") AS ?b) 
    BIND(if(bound(?c_tmp), ?c_tmp, "missing") AS ?c) 
    } 

答えて

5

私はおそらくここcoalesceを使用したい:IFとの組み合わせで

+0

これは完璧です、ありがとうございます! – Xaju

3

SPARQL 1.1 BINDは、これを達成するために使用することができ

SELECT 
    ?a 
    (coalesce (?b, ?missing) as ?bb) 
    (coalesce (?c, ?missing) as ?cc) 
WHERE { 
    VALUES ?missing { "missing" } 
    ?a nmo:hasObject nm:coin 
    OPTIONAL 
    { ?a nmo:hasAuthority ?b } 
    OPTIONAL 
    { ?a nmo:hasMaterial ?c } 
} 
+0

I'veはこれを試してみましたが、私は、解析例外が発生しました私は?cの後に二番目を削除しましたが、まだそこにあります。 – Xaju

+0

ああ、申し訳ありません - 私は変数を割り当てるのを忘れていました。今修正されました。しかし、ジョシュア・テイラーの答えは実際よりコンパクトです:D – AKSW