2016-10-30 17 views
1

人口が最も多い都市を選択しようとしています。私のクエリは次のようになります。入れ子選択のSparql構文エラー

PREFIX dct: <http://purl.org/dc/terms/> 
PREFIX dbpedia: <http://dbpedia.org/resource/> 
PREFIX db: <http://dbpedia.org/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX dbc: <http://dbpedia.org/resource/Category:> 
PREFIX dbo: <http://dbpedia.org/ontology/> 

SELECT ?population ?capital 
WHERE { 

    ?x dct:subject dbc:Countries_in_Europe . 
    ?x dbo:capital ?capital . 
    ?capital dbo:populationTotal ?population . 

    FILTER (?population = 
     (
      SELECT MAX(?popul) AS ?pop 
      WHERE{ 
       ?capital dbo:populationTotal ?popul . 
      } 
     ) 
) 

} 
LIMIT 200 

私はapacheの-イエナ-布石-2.4.0を使用して、構文エラー Encountered " "select" "SELECT "" at line 18, column 1. 問題がある任意のアイデアを取得していますThis PDF 5ページ を追っhaved?

+1

リンクされたPDFドキュメント(または他の場所)では、ここで使用しているサブクエリ構文がApache Jena Fusekiによってサポートされていることがわかりますか?論文をざっと見てみると、著者は将来の言語の拡張を提案しているようだ。この論文の例は、現在サポートされている構文であると主張されていません。あなたは、ユーザーマニュアルではなく、「機能要求」を見ています。 –

+0

これは実際には構文エラーでも機能しますが、すべての大文字をpopで返します。 number ... filterが期待通りに機能していないようです – TomP

答えて

3

SELECTクエリの結果をFILTER内の変数にバインドすることができますが、それはまったく間違っています。これはSQLでは機能しますが、SPARQLでは機能しません。

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX dct: <http://purl.org/dc/terms/> 
PREFIX dbc: <http://dbpedia.org/resource/Category:> 
PREFIX dbpedia: <http://dbpedia.org/resource/> 
PREFIX db: <http://dbpedia.org/> 

SELECT ?population ?capital 
WHERE 
    { ?x  dct:subject   dbc:Countries_in_Europe ; 
       dbo:capital   ?capital . 
    ?capital dbo:populationTotal ?population 
    FILTER (?population = ?pop) 

    # sub-SELECTs are evaluated first and encapsulated by { } 
    # in addition (as to TomP's comment), you have to restrict to European captials here 
    { SELECT (MAX(?popul) AS ?pop) 
     WHERE 
     { ?x  dct:subject   dbc:Countries_in_Europe ; 
        dbo:capital   ?capital . 
      ?capital dbo:populationTotal ?popul } 
    } 
    } 
LIMIT 200 

しかし、あなたが本当にあなたのタスクを反映して、より簡単かつ明白な方法を使用していない理由は、「最高の人口を持つヨーロッパで資本」を持つようにしたい場合は、すなわちORDER BY + LIMIT 1

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX dct: <http://purl.org/dc/terms/> 
PREFIX dbc: <http://dbpedia.org/resource/Category:> 
PREFIX dbpedia: <http://dbpedia.org/resource/> 
PREFIX db: <http://dbpedia.org/> 

SELECT ?population ?capital 
WHERE 
    { ?x  dct:subject   dbc:Countries_in_Europe ; 
       dbo:capital   ?capital . 
    ?capital dbo:populationTotal ?population  
    } 
ORDER BY DESC(?population) 
LIMIT 1 
+1

"SELECTクエリの結果をFILTERの変数にバインドできることがわかっていますが、それはまったく間違っています。" - それは質問にリンクされた紙の中にあります。しかし、この論文は「これは現在のソフトウェアで動作します」とは思われないが、むしろ「SPARQLは今後このように拡張されるかもしれない」と述べているようだ。 –

+0

サブセレクトが最初に評価されるので、それをもっと追加する必要があります。 ?x dct:件名dbc:Countries_in_Europe; dbo:資本?資本。追加する必要があります。その後、それは動作します – TomP

+0

@TomPあなたは正しいです。私は質問の目標が何であるかを確認しなかったが、彼はヨーロッパで最高の人口を持つ首都を望んでいると思う。しかし、これは 'ORDER BY DESC(?population)' + 'LIMIT 1'で簡単に解決できます。 – AKSW

関連する問題