2012-03-15 13 views
7

Próbuję zbudować małą semantyczną aplikację internetową wykorzystującą framework Jena, JSP i JAVA. Mam zdalny punkt końcowy SPARQL i już napisałem proste zapytanie, które działa dobrze, ale teraz muszę użyć niektórych parametrów. Oto mój kod do tej pory:Sparametryzowane zapytanie SPARQL z 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(); 
} 

Co chcę zrobić to sparametryzować? Nazwę. Jestem nowy w Jenie i nie jestem pewien, jak używać parametrów w zapytaniu SPARQL. Byłbym wdzięczny, gdyby ktoś mógł mi w tym pomóc.

+0

Powielone na http://answers.semanticweb.com/questions/15237/parameterized-sparql-query-with-jena – RobV

+0

@sandra Czy któraś z tych odpowiedzi zakończy się dla Ciebie? Jeśli tak, powinieneś zaakceptować to, aby inni wiedzieli, że było użyteczne. –

Odpowiedz

6

Jeśli chcesz ograniczyć zmienną do określonej wartości dla zapytań lokalnych, możesz to zrobić z przeciążeniem metody QueryFactory.create(), która wymaga ustawienia wartości na poziomie QuerySolutionMap. Pamiętaj, że to nie zmienia twojego zapytania, ogranicza wyniki końcowe, więc nie jest to naprawdę parametryzacja.

Jeśli chcesz mieć prawdziwe sparametryzowane zapytania (tj. Zmienne zastępcze dla stałych), możesz to zrobić na kilka sposobów w zależności od wersji ARQ.

Używanie dowolnego aktualnego wydania (do 2.9.0) jedynym sposobem, aby to zrobić, jest konkatenacja ciągów, tj. Zamiast mieć nazwę w zapytaniu wystarczy wstawić żądaną wartość, np. "Bob"

Korzystanie z najnowszej magistrali (od wersji 2.9.1-SNAPSHOT) to nowa klasa ParameterizedSparqlString, która czyni ją bardziej przyjazną dla użytkownika, np.

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

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

I faktycznie można uprościć kod dalej od ParameterizedSparqlString posiada interfejs w stylu StringBuffer i mogą być wykorzystane do budowy kawałek po kawałku zapytań i zawiera przydatne funkcje jak poprzedzenie prefiksy do zapytania.

Zaletą tej nowej metody jest to, że zapewnia ona bardziej ogólny sposób wykonywania sparametryzowanych zapytań, które mogą być również używane z aktualizacjami i nadaje się do przygotowywania zdalnych zapytań, których nie obejmują istniejące metody.

+0

Dzięki Rob, spróbuję tego co zasugerowałeś. Co zamierzam zrobić, to uzyskać dane wejściowe od użytkownika np. nazwę i przekazać tę wartość do? name w moim zapytaniu. Czy istnieją inne ramy, które oferują tę funkcję lub ogólnie lepiej jest używać niż framework Jena? – sandra

+1

Prawdopodobnie możesz zrobić to samo z Sezamem, ale nie znam szczegółów, które ramy najlepiej dla ciebie będą zależeć od tego, jakie rzeczy musisz zrobić. Jeśli masz dalsze pytania, które nie są bezpośrednio związane z tą odpowiedzią, poproś ich o nowe pytania na stronie, aby były bardziej widoczne – RobV

2

Możesz spróbować spojrzeć na Twinkql. Jest to framework mapowania SPARQL na Java. Używa Jeny na zapleczu, ale stara się uprościć zapytania SPARQL i powiązanie wyników z Java.

To pozwala na zdefiniowanie zapytań SPARQL w 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> 

Zanotuj #{novelName} zastępczy - to jest, gdy parametry mogą być przekazywane w momencie zapytania.

Ponadto, wyniki mogą być związane z 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> 

Istnieje API zadzwonić te pytania, aby przejść w parametrach itd To jest podobnie jak MyBatis, ale dla SPARQL zamiast SQL.

Powiązane problemy