2013-08-14 33 views
6

Tôi đang cố gắng trích xuất nhãn từ DBpedia cho một số người. Bây giờ tôi đã thành công một phần, nhưng tôi đã gặp khó khăn trong vấn đề sau. Mã sau hoạt động.truy vấn sparql với dấu ngoặc tròn ném ngoại lệ

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; 
    } 
} 

Tuy nhiên, khi thực thể chứa dấu ngoặc đơn, nó không hoạt động. Ví dụ,

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

dẫn đến ngoại lệ này:

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

vấn đề là gì?

+0

bạn có thể cung cấp nội dung của dòng 86 không? Ngoài ra nó trông hơi giống một lỗi cú pháp đối với tôi. – Framester

+0

Dấu ngoặc tròn (hoặc dấu ngoặc đơn, trong phương ngữ địa phương của tôi) được sử dụng để bao quanh các đối số hàm trong SPARQL, vd trong 'concat ('[',? X, ']')', vì vậy tôi mong rằng đây là cú pháp lỗi. Có thể bạn sẽ cần sử dụng dạng đầy đủ của URI của bạn, được bao quanh bởi '<' and '>'. –

Trả lời

6

Phải mất một số sao chép và dán để xem chính xác những gì đang diễn ra. Tôi khuyên bạn nên đặt dòng mới trong truy vấn của mình để dễ đọc hơn. Truy vấn mà bạn đang sử dụng là:

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

nơi ??? đang được thay thế bởi nội dung của chuỗi entity. . Bạn đang làm hoàn toàn không có xác nhận đầu vào ở đây để đảm bảo rằng giá trị của entity sẽ quy phạm pháp luật để dán ở Dựa trên câu hỏi của bạn, có vẻ như entity chứa William_H._Miller_(writer), vì vậy bạn đang nhận được truy vấn:

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")) 
} 

bạn có thể dán vào public DBpedia endpoint, và bạn sẽ nhận được một thông điệp tương tự lỗi phân tích cú pháp:

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")) 
} 

tốt hơn so với đánh endpoint dbpedia với truy vấn xấu, bạn cũng có thể sử dụng the SPARQL query validator, mà báo cáo cho truy vấn đó:

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

Trong Jena, bạn có thể sử dụng ParameterizedSparqlString để tránh các loại sự cố này. Dưới đây là ví dụ của bạn, làm lại sử dụng một chuỗi tham số:

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()); 
    } 
} 

Đầu ra là:

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")) 
} 

Bạn có thể chạy truy vấn này tại thiết bị đầu cuối công và nhận được the expected results. Chú ý rằng nếu bạn sử dụng một entity mà không cần thoát đặc biệt, ví dụ như,

final String entity = "George_Washington"; 

sau đó sản lượng truy vấn sẽ sử dụng các hình thức tiền tố:

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")) 
} 

này rất thuận lợi, bởi vì bạn don' t phải làm bất kỳ nào kiểm tra xem hậu tố của bạn, tức là, entity, có bất kỳ ký tự nào cần được thoát; Jena chăm sóc điều đó cho bạn.

+0

Cảm ơn bạn rất nhiều Joshua Taylor vì đã dành thời gian và giúp đỡ. Tôi chạy truy vấn được tạo và nó hoạt động.Tuy nhiên, chạy mã của bạn ném một ngoại lệ khác: Ngoại lệ trong chuỗi "chính" java.lang.NoClassDefFoundError: com/hp/hpl/jena/graph/NodeFactory \t tại com.hp.hpl.jena.query.ParameterizedSparqlString.setIri (ParameterizedSparqlString java: 720) \t tại nl.cwi.kba2013.apps.PssExample.main (PssExample.java:26) \t tại com.hp.hpl.jena.query.ParameterizedSparqlString.setIri (ParameterizedSparqlString.java:720) \t .... – gebremeskel

+0

@ use1967220 Nếu bạn gặp lỗi đó cho thấy vấn đề về đường dẫn lớp (có thể là nhiều phiên bản ARQ trên đường dẫn lớp học của bạn). Bạn đang sử dụng phiên bản ARQ nào (và bất kỳ thư viện Jena nào khác)? – RobV

+0

@RobV, Cảm ơn bạn rất nhiều. Đó thực sự là vấn đề – gebremeskel