3 votes

L'utilisation du littéral de DataTypeProperty dans une requête SPARQL ne fonctionne pas

J'essaie d'exécuter une requête SPARQL très simple pour récupérer la nationalité d'une personne à partir d'un nom passé dans la chaîne de requête, et je ne comprends pas pourquoi cela ne fonctionne pas. Voici les règles RDF pertinentes....

<owl:DatatypeProperty rdf:ID="name">
<rdfs:domain rdf:resource="#NobelWinner"/>
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
<rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string">All laureates have a name.</rdfs:comment>
</owl:DatatypeProperty>

<owl:DatatypeProperty rdf:ID="nationality">
<rdfs:domain rdf:resource="#PersonWinner"/>
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
<rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string">
Person laureates were associated with a nation when they won the prize.
</rdfs:comment>
</owl:DatatypeProperty>

Le code est dans un servlet Java et ressemble à ceci, avec la requête SPARQL à la ligne 42.....

              try {
 34             String prefix1 = "PREFIX nob:<http://swat.cse.lehigh.edu/resources/onto/nobel.owl#> ";
 35             String prefix2 = "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> ";
 36             String prefix3 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> ";
 37             String prefix4 = "PREFIX nobdat:<http://swat.cse.lehigh.edu/resources/data/nobel/nobeldata.owl#> ";
 38             String prefix = prefix1+prefix2+prefix3+prefix4;
 39             String winnerName = request.getParameter("name");
 40
 41             // INSERT QUERY
 42             String queryString  = prefix +
 43                 "SELECT ?nat { ?s nob:name " + winnerName + ". ?s nob:nationality ?nat. }";
 44
 45             String ttlLoc = "/my/ttl/path/loc.ttl";
 47             Store store = SDBFactory.connectStore(ttlLoc);
 48             Dataset ds = DatasetStore.create(store) ;
 49
 50             // CREATE QUERY
 51             Query query = QueryFactory.create(queryString);
 52             QueryExecution qe = QueryExecutionFactory.create(query, ds);

                    while (rs.hasNext()) {
 66                     QuerySolution qs = rs.nextSolution();
 67                     String nationality = qs.getLiteral("?nat").toString();
 68                     out.println("<P>Nationality: " + nationality + "</P>");
 69                 }

Je n'arrive pas non plus à faire fonctionner dans l'IDE Protege la requête ou tout autre élément similaire qui utiliserait une chaîne littérale à la place d'un nom. Avez-vous une idée ? Merci.

2voto

AndyS Points 4800

winnerName doit être une constante SPARQL, c'est-à-dire avec des guillemets - vous pouvez utiliser des guillemets simples :

.... ?s nob:name '" + winnerName + "' . ?s nob:nationality

Utilisez Dataset ds = SBDFcatoryconnectDataset(ttlloc) ;

A plus long terme, pensez à créer le datset dans l'initialisation de l'ervlet, et non à chaque requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X