2011-05-14 3 views
4

j'ai quelques rdf & fichiers rdfs et je veux utiliser la mise en œuvre jena SPARQL pour l'interroger et mon regard de code comme:SPARQL requête avec Inférence

//model of my rdf file 
Model model = ModelFactory.createMemModelMaker().createDefaultModel(); 
model.read(inputStream1, null); 
//model of my ontology (word net) file 
Model onto = ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM_RDFS_INF); 
onto.read(inputStream2,null); 
    String queryString = 
         "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " 
         + "PREFIX wn:<http://www.webkb.org/theKB_terms.rdf/wn#> " 
         + "SELECT ?person " 
         + "WHERE {" 
         + " ?person rdf:type wn:Person . " 
         + "  }"; 

    Query query = QueryFactory.create(queryString); 
    QueryExecution qe = QueryExecutionFactory.create(query, ????); 
    ResultSet results = qe.execSelect(); 
    ResultSetFormatter.out(System.out, results, query); 
    qe.close(); 

et j'ai un WORDNET Ontologie dans le fichier rdf et je veux pour utiliser cette ontologie dans ma requête pour faire des inférences automatiquement (quand je demande à la personne la requête devrait retourner par exemple Man, Femme) alors comment lier l'ontologie à ma requête? Aidez-moi, s'il vous plaît.

mise à jour: maintenant j'ai des modèles de remorquage: à partir de laquelle je devrais exécuter ma requête?

QueryExecution qe = QueryExecutionFactory.create(query, ????); 

merci d'avance.

Répondre

6

La clé est de reconnaître que, dans Iéna, Model est l'une des abstractions centrales. Un modèle d'inférence est juste un Model, dans lequel certains des triplets sont présents parce qu'ils sont entraînés par des règles d'inférence plutôt que de lire à partir du document source. Vous n'avez donc besoin de modifier que la première ligne de votre exemple, où vous créez initialement le modèle.

Alors que vous pouvez create inference models directement, il est souvent plus simple d'create an OntModel avec le degré de soutien requis d'inférence:

Model model = ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM_RDFS_INF); 

Si vous voulez un raisonneur différent, ou le soutien OWL, vous pouvez sélectionner une constante OntModelSpec différente. Sachez que les modèles volumineux et/ou complexes peuvent générer des requêtes lentes.

Mise à jour (après modification de la question originale)

Raisonner plus de deux modèles, vous voulez que le syndicat. Vous pouvez le faire grâce à la facette du sous-modèle de OntModel. Je voudrais changer votre exemple comme suit (note: Je ne l'ai pas testé ce code, mais il devrait fonctionner):

String rdfFile = "... your RDF file location ..."; 
Model source = FileManager.get().loadModel(rdfFile); 

String ontFile = "... your ontology file location ..."; 
Model ont = FileManager.get().loadModel(ontFile); 

Model m = ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM_RDFS_INF, ont); 
m.addSubModel(source); 

String queryString = 
        "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " 
        + "PREFIX wn:<http://www.webkb.org/theKB_terms.rdf/wn#> " 
        + "SELECT ?person " 
        + "WHERE {" 
        + " ?person rdf:type wn:Person . " 
        + "  }"; 

Query query = QueryFactory.create(queryString); 
QueryExecution qe = QueryExecutionFactory.create(query, m); 
ResultSet results = qe.execSelect(); 
ResultSetFormatter.out(System.out, results, query); 
qe.close(); 
+0

merci pour votre aide, j'utilise ce modèle pour charger mon rdf que je veux interroger, mais comment charger le fichier d'ontologie (.rdf) et l'utiliser pour l'inférence lors de l'exécution de la requête? – Radi

+0

Voir les Javadocs pour 'Model.read()' ou 'FileManager.readModel()'. Personnellement, j'utiliserais la route 'FileManager'. –

+0

s'il vous plaît vérifier ma modification. merci – Radi