2013-08-14 17 views
6

DBpediaからラベルを抽出しようとしています。私は今、部分的に成功していますが、私は次の問題に悩まされています。次のコードは動作します。円括弧付きのsparqlクエリで例外が発生する

public class DbPediaQueryExtractor { 
    public static void main(String [] args) { 
     String entity = "Aharon_Barak"; 
     String queryString ="PREFIX dbres: <http://dbpedia.org/resource/> SELECT * WHERE {dbres:"+ entity+ "<http://www.w3.org/2000/01/rdf-schema#label> ?o FILTER (langMatches(lang(?o),\"en\"))}"; 
     //String queryString="select *  where { ?instance <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person>; <http://www.w3.org/2000/01/rdf-schema#label> ?o FILTER (langMatches(lang(?o),\"en\")) } LIMIT 5000000"; 
     QueryExecution qexec = getResult(queryString); 
     try { 
      ResultSet results = qexec.execSelect(); 
      for (; results.hasNext();) 
      { 
       QuerySolution soln = results.nextSolution(); 
       System.out.print(soln.get("?o") + "\n"); 
      } 
     } 
     finally { 
      qexec.close(); 
     } 
    } 

    public static QueryExecution getResult(String queryString){ 
     Query query = QueryFactory.create(queryString); 
     //VirtuosoQueryExecution vqe = VirtuosoQueryExecutionFactory.create (sparql, graph); 
     QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query); 
     return qexec; 
    } 
} 

ただし、括弧が含まれていると機能しません。例えば、

String entity = "William_H._Miller_(writer)"; 

は、この例外につながる:

Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " "(" "("" at line 1, column 86.`

問題は何ですか?

+0

86行目の内容を教えてください。また、私は構文エラーのように見えます。 – Framester

+0

丸括弧(またはローカルの方言の括弧)は、例えば 'concat( '['、?x、 ']')'などのSPARQLの関数引数を囲むために使用されます。エラー。 「<' and '>」で囲まれた完全な形式のURIを使用する必要があります。 –

答えて

6

正確に何が起こっていたかを確認するために、コピーと貼り付けが必要でした。私はあなたのクエリに改行を入れて読みやすくすることをお勧めします。あなたが使用しているクエリは次のとおりです。???が文字列entityの内容によって置き換えられている

PREFIX dbres: <http://dbpedia.org/resource/> 
SELECT * WHERE 
{ 
    dbres:??? <http://www.w3.org/2000/01/rdf-schema#label> ?o 
    FILTER (langMatches(lang(?o),"en")) 
} 

。あなたはentityの値がに貼り付けることは合法となることを確実にするためにここに全く入力検証をやっていないしているあなたの質問に基づいて、entityWilliam_H._Miller_(writer)が含まれているように聞こえるので、クエリを取得している:。

PREFIX dbres: <http://dbpedia.org/resource/> 
SELECT * WHERE 
{ 
    dbres:William_H._Miller_(writer) <http://www.w3.org/2000/01/rdf-schema#label> ?o 
    FILTER (langMatches(lang(?o),"en")) 
} 

あなたpublic DBpedia endpointにそれを貼り付けることができ、あなたが同様の解析エラーメッセージが得られます:悪いクエリとDBpediaの者のエンドポイントを打つよりも

Virtuoso 37000 Error SP030: SPARQL compiler, line 6: syntax error at 'writer' before ')' 

SPARQL query: 
define sql:big-data-const 0 
#output-format:text/html 
define sql:signal-void-variables 1 define input:default-graph-uri <http://dbpedia.org> PREFIX dbres: <http://dbpedia.org/resource/> 
SELECT * WHERE 
{ 
    dbres:William_H._Miller_(writer) <http://www.w3.org/2000/01/rdf-schema#label> ?o 
    FILTER (langMatches(lang(?o),"en")) 
} 

より良い、あなたもthe SPARQL query validatorを使用することができ、そのクエリのレポート:

Syntax error: Lexical error at line 4, column 34. Encountered: ")" (41), after : "writer"

Jenaでは、これらの問題を回避するためにParameterizedSparqlStringを使用できます。ここではあなたの例だ、パラメータ化された文字列を使用するように作り直さ:

import com.hp.hpl.jena.query.ParameterizedSparqlString; 

public class PSSExample { 
    public static void main(String[] args) { 
     // Create a parameterized SPARQL string for the particular query, and add the 
     // dbres prefix to it, for later use. 
     final ParameterizedSparqlString queryString = new ParameterizedSparqlString(
       "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" + 
       "SELECT * WHERE\n" + 
       "{\n" + 
       " ?entity rdfs:label ?o\n" + 
       " FILTER (langMatches(lang(?o),\"en\"))\n" + 
       "}\n" 
       ) {{ 
      setNsPrefix("dbres", "http://dbpedia.org/resource/"); 
     }}; 

     // Entity is the same. 
     final String entity = "William_H._Miller_(writer)"; 

     // Now retrieve the URI for dbres, concatentate it with entity, and use 
     // it as the value of ?entity in the query. 
     queryString.setIri("?entity", queryString.getNsPrefixURI("dbres")+entity); 

     // Show the query. 
     System.out.println(queryString.toString()); 
    } 
} 

出力は次のようになります。

PREFIX dbres: <http://dbpedia.org/resource/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT * WHERE 
{ 
    <http://dbpedia.org/resource/William_H._Miller_(writer)> rdfs:label ?o 
    FILTER (langMatches(lang(?o),"en")) 
} 

あなたは公共のエンドポイントでこのクエリを実行し、the expected resultsを得ることができます。

PREFIX dbres: <http://dbpedia.org/resource/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT * WHERE 
{ 
    dbres:George_Washington rdfs:label ?o 
    FILTER (langMatches(lang(?o),"en")) 
} 

あなたはドンので、これは、非常に便利である」:クエリの出力は、接頭辞の形式を使用します

final String entity = "George_Washington"; 

、例えば、あなたは特別なエスケープを必要としないentityを使用している場合ことに注意してくださいあなたの接尾辞、つまりentityにエスケープする必要がある文字があるかどうかを確認してください。ジェナはあなたのためにそれを世話します。

+0

時間をかけて助けてくれてありがとうJoshua Taylorに感謝します。私は生成されたクエリを実行し、それは働いた。しかし、コードを実行すると別の例外がスローされます。スレッド "main"の例外java.lang.NoClassDefFoundError:com/hp/hpl/jena/graph/NodeFactory \t com.hp.hpl.jena.query.ParameterizedSparqlString.setIri(ParameterizedSparqlString .java:720)nl.cwi.kba2013.apps.PssExample.main(PssExample.java:26)com.hp.hpl.jena.query.ParameterizedSparqlString.setIriで \t(ParameterizedSparqlString.java:720で \t) \t .... – gebremeskel

+0

@ use1967220クラスパスの問題を示唆するエラーが発生した場合(クラスパスに複数のバージョンのARQがある可能性があります)。 ARQ(および他のJenaライブラリ)のどのバージョンを使用していますか? – RobV

+0

@RobV、ありがとうございます。それは確かに問題だった – gebremeskel

関連する問題