2014-06-26 2 views
0

J'essaie d'apprendre les bases du travail avec Jena et RDF Triples. Travaillant également avec une base de données Oracle, donc en suivant leur guide, j'ai quelques exemples de programmes en cours d'exécution, tels que Example7-18 SPARQL OPTIONAL Query. L'exemple fonctionne bien comme écrit. Il permet des requêtes correspondant telles queAjout de l'âge (littéraux entiers) aux triplets Jena RDF, et interrogation sur eux avec SPARQL

where {?s <u:parentOf> ?o} 

where {<u:John> <u:parentOf> <u:Mary>} 

Ce que je voudrais faire est de donner John, Mary et Jill un âge chacun afin que je puisse interroger et filtre sur l'âge comme décrit dans SPARQL By Example: The Cheat Sheet, page 10:

A . B . FILTER (…expr…) 

where {?s <u:parentOf> ?o . ?o <u:isAge> ?a . filter (?a < 20) } 

avec le code actuel pour triplets je ne peux ajouter des chaînes/URI nœuds, et bien que je pouvais faire un triple tel que <u:John> <u:isAge> <u:35>, je ne peux pas filtrer et faire des comparaisons avec, par exemple, l'opérateur < sur cet âge, donc ce n'est pas très utile.

Je regarde autour depuis un moment maintenant et je pense que cela est très simple, mais les échantillons de code ont été difficiles à trouver.

+0

Notez que le texte comme '' est traité comme balisage dans l'éditeur, vous devez l'entourer de guillemets obliques '\' ', ou bien personne ne peut le voir . Je l'ai réparé dans ce cas. –

Répondre

2

Notez que vous voulez un objet comme "35"^^xsd:int ou "35^^xsd:integer, qui sont des littéraux, pas <u:35> qui est un URI (peut-être mal formé). L'exemple est, à mon avis, de faire les choses d'une manière quelque peu inhabituelle, et selon la documentation, il utilise des méthodes obsolètes. En tout cas, vous pouvez voir que la création de noeuds URI avec des méthodes de la classe Node (une classe usine):

Node.createURI("u:John") 
Node.createURI("u:parentOf") 
Node.createURI("u:Mary") 

Il y a cinq méthodes createLiteral dans la classe Node, et vous pouvez utiliser createLiteral(String lex, RDFDatatype dtype) pour créer un littéral avec un type de données. Cette méthode est cependant obsolète, et vous devriez vraiment utiliser l'une des méthodes de NodeFactory à la place. Cela dit, je ne sais pas si l'exemple utilise l'interface graphique pour créer des triplets plutôt que l'interface du modèle. Vous avez déjà un modèle à partir de:

ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); 

et cette tâche est beaucoup plus facile à faire si vous utilisez l'interface Model, où vous avez des méthodes telles que createTypedLiteral de sorte que vous pouvez simplement appeler createTypedLiteral(30) et retourner un littéral approprié . Voici un exemple:

import java.math.BigInteger; 

import com.hp.hpl.jena.query.Query; 
import com.hp.hpl.jena.query.QueryExecution; 
import com.hp.hpl.jena.query.QueryExecutionFactory; 
import com.hp.hpl.jena.query.QueryFactory; 
import com.hp.hpl.jena.query.ResultSetFormatter; 
import com.hp.hpl.jena.rdf.model.Model; 
import com.hp.hpl.jena.rdf.model.ModelFactory; 
import com.hp.hpl.jena.rdf.model.Property; 
import com.hp.hpl.jena.rdf.model.Resource; 

public class CreateAndQueryExample { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // You should be able to replace this with the Oracle model 
     // producing code. 
     Model model = ModelFactory.createDefaultModel(); 

     Resource john = model.createResource("urn:ex:John"); 
     Resource mary = model.createResource("urn:ex:Mary"); 
     Property age = model.createProperty("urn:ex:age"); 

     // Using Model.add method 
     model.add(john, age, model.createTypedLiteral(new BigInteger("25"))); // "25"^^xsd:integer 
     // model.add(john, age, model.createTypedLiteral(25));     // "25"^^xsd:int 
     // model.add(john, age, model.createTypedLiteral(25l));     // "25"^^xsd:long 

     // Using the Resource.addProperty method 
     mary.addProperty(age, model.createTypedLiteral(new BigInteger("35"))); 

     Query query = QueryFactory.create("select * where { ?s <urn:ex:age> ?age . filter (?age < 30) }"); 
     QueryExecution exec = QueryExecutionFactory.create(query, model); 
     ResultSetFormatter.out(exec.execSelect()); 
    } 
} 
----------------------- 
| s    | age | 
======================= 
| <urn:ex:John> | 25 | 
----------------------- 
+0

Merci, ceci est utile, mais vous avez omis les relations '' entre les ressources. Les ajouteriez-vous aussi avec model.add comme s'ils étaient des littéraux? Quelle différence cela fait-il si j'ajoute mes relations en tant que littéraux ou en tant que triplés? – user985366

+0

@ user985366 Je ne les ai pas oubliés. Votre question posée à propos de ** Ajout de l'âge (littéraux entiers) aux triplets Jena RDF, et interrogation sur eux avec SPARQL ** et cette réponse montre comment faire ces deux choses. Vous avez déjà un moyen d'ajouter des nœuds URI, et si vous voulez le faire en utilisant l'interface Modèle et les interfaces associées, la réponse a des liens vers ces interfaces. –

+0

Si vous allez écrire un modèle comme '? S: parentOf? O. ? o: hasAge? a', alors parentOf doit être une relation entre les ressources (c'est-à-dire, les nœuds vides et les nœuds URI, mais pas les littéraux). Les littéraux ne peuvent pas faire l'objet de triplets, donc si vous avez utilisé un littéral dans parentOf, par ex., ': John: parentOf" Mary "', vous n'avez pas de chance dans le deuxième triplé, parce que vous ne pouvez pas dire '' Mary'': hasAge 25'. –

Questions connexes