2012-03-15 39 views
7

Tôi đang cố gắng xây dựng một ứng dụng web ngữ nghĩa nhỏ bằng cách sử dụng khung công tác Jena, JSP và JAVA. Tôi có một điểm cuối SPARQL từ xa và tôi đã viết một truy vấn đơn giản mà hoạt động tốt nhưng bây giờ tôi cần phải sử dụng một số tham số. Đây là mã của tôi cho đến thời điểm này:Truy vấn SPARQL tham số với JENA

final static String serviceEndpoint = "http://fishdelish.cs.man.ac.uk/sparql/"; 

String comNameQuery = 
     "PREFIX fd: <http://fishdelish.cs.man.ac.uk/rdf/vocab/resource/> " + 
     "SELECT ?name ?language ?type" + 
     "WHERE { ?nameID fd:comnames_ComName ?name ;" + 
     "fd:comnames_Language ?language ;" + 
     "fd:comnames_NameType ?type ." + 
     "}"; 

Query query = QueryFactory.create(comNameQuery); 
QueryExecution qe = QueryExecutionFactory.sparqlService(serviceEndpoint,query); 

try { 
    ResultSet rs = qe.execSelect(); 
    if (rs.hasNext()) { 
     System.out.println(ResultSetFormatter.asText(rs)); 
    } 
} 
catch(Exception e) { 
    System.out.println(e.getMessage()); 
} 
finally { 
    qe.close(); 
} 

Điều tôi muốn làm là đặt tên tham số? Tôi mới đến Jena và tôi không thực sự chắc chắn làm thế nào để sử dụng các tham số trong một truy vấn SPARQL. Tôi sẽ đánh giá cao nếu ai đó có thể giúp tôi với điều này.

+0

Đã sao chép trên http://answers.semanticweb.com/questions/15237/parameterized-sparql-query-with-jena – RobV

+0

@sandra Có bất kỳ câu trả lời nào trong số những câu trả lời cuối cùng này phù hợp với bạn không? Nếu có, bạn nên chấp nhận nó để cho người khác biết rằng nó hữu ích. –

Trả lời

6

Nếu bạn chỉ muốn hạn chế biến có giá trị nhất định cho truy vấn cục bộ, bạn có thể thực hiện quá tải phương pháp QueryFactory.create() mất QuerySolutionMap để đặt giới hạn giá trị. Lưu ý điều này không làm thay đổi truy vấn của bạn chỉ hạn chế kết quả cuối cùng vì vậy đây không phải là tham số thực sự.

Nếu bạn muốn thực sự có các truy vấn được tham số đúng (tức là các biến thay thế cho hằng số) thì có một số cách để thực hiện việc này tùy thuộc vào phiên bản ARQ của bạn.

Sử dụng bất kỳ bản phát hành hiện tại nào (tối đa 2.9.0) cách duy nhất để làm điều đó là nối chuỗi, tức là thay vì có tên? Trong truy vấn của bạn, bạn chỉ cần chèn giá trị bạn muốn, ví dụ: "Bob"

Sử dụng thân cây mới nhất (2.9.1-SNAPSHOT trở đi) có một lớp ParameterizedSparqlString mới làm cho thân thiện với người dùng này nhiều hơn, ví dụ:

ParameterizedSparqlString queryStr = new ParameterizedSparqlString(comNameQuery); 
queryStr.setLiteral("name", "Bob"); 

Query query = QueryFactory.create(queryStr.toString()); 

Và trong thực tế, bạn có thể đơn giản hóa mã của bạn hơn nữa kể từ ParameterizedSparqlString có một giao diện phong cách StringBuffer và có thể được sử dụng để xây dựng chút truy vấn của bạn bằng cách bit và bao gồm các chức năng hữu ích như prepending tiền tố truy vấn của bạn. Ưu điểm của phương pháp mới này là nó cung cấp một cách chung chung hơn để thực hiện các truy vấn được tham số hóa cũng có thể được sử dụng với các bản cập nhật và có thể sử dụng để chuẩn bị các truy vấn từ xa mà các phương thức hiện có không bao gồm.

+0

Cảm ơn Rob Tôi sẽ cố gắng những gì bạn đề nghị. Điều tôi định làm là lấy thông tin từ người dùng cho ví dụ: tên và chuyển giá trị này cho tên? trong truy vấn của tôi. Có khung công tác nào khác cung cấp chức năng này hay nói chung là tốt hơn để sử dụng hơn khung công tác Jena? – sandra

+1

Bạn có thể làm điều tương tự với Sesame nhưng tôi không biết chi tiết, khung nào là tốt nhất cho bạn sẽ phụ thuộc vào những thứ bạn cần làm. Nếu bạn có thêm câu hỏi không liên quan trực tiếp đến câu trả lời này, hãy hỏi họ làm câu hỏi mới trên trang web để chúng được hiển thị rộng rãi hơn – RobV

2

Bạn có thể thử xem xét Twinkql. Nó là một khung công tác ánh xạ SPARQL tới Java. Nó sử dụng Jena ở phía sau, nhưng cố gắng đơn giản hóa các truy vấn SPARQL và kết buộc Java của các kết quả.

Nó cho phép bạn xác định các truy vấn SPARQL trong xml:

<select id="getNovel" resultMap="novelResultMap"> 
<![CDATA[ 
    SELECT ?novel ?author 
    WHERE { 
     ?novel a <http://dbpedia.org/class/yago/EnglishNovels> ; 
      <http://dbpedia.org/property/name> "#{novelName}"@en ; 
      <http://dbpedia.org/property/author> ?author . 
    } 
]]> 
</select> 

Lưu ý #{novelName} giữ chỗ - đây là nơi mà các thông số có thể được thông qua trong lúc truy vấn.

Ngoài ra, kết quả có thể được liên kết với Java Beans:

<resultMap id="novelResultMap" resultClass="org.twinkql.example.Novel"> 
    <uniqueResult>novel</uniqueResult> 
    <rowMap var="novel" varType="localName" beanProperty="name" /> 
    <rowMap var="author" varType="localName" beanProperty="author"/> 
</resultMap> 

Có một API để gọi các truy vấn này, để vượt qua trong các thông số, vv Đây là giống như MyBatis, nhưng đối với SPARQL thay vì SQL.

Các vấn đề liên quan