2017-09-29 3 views
0

Les documents Jena ici https://jena.apache.org/documentation/javadoc/jena/index.html indiquent que createOntologyModel inclut un raisonneur faible pour la fermeture transitive sur les hiérarchies de sous-classe et de sous-propriété, ce qui est tout ce que je recherche. A partir d'un modèle simple:L'inférence RDFS dans Iéna en utilisant ARQ (SPARQL)

x:A rdf:type rdfs:Class . 
x:A x:prop1 x:whatever . 

x:B rdf:type rdfs:Class . 
x:B rdfs:subClassOf x:A . 
x:B x:prop2 x:other . 

x:myInstance rdf:type x:B . 

Je cherche à interroger pour rdf:type x:B et obtenir toutes les propriétés pour B et A superclasse, par exemple

(?all = <x:whatever>) (?props = <x:prop1>) -> (?type = <x:A>) -> [Root] 
(?all = <x:A>) (?props = <rdfs:subClassOf>) -> (?type = <x:B>) -> [Root] 
(?all = <x:other>) (?props = <x:prop2>) -> (?type = <x:B>) -> [Root] 
(?all = <rdfs:Class>) (?props = <rdf:type>) -> (?type = <x:B>) -> [Root] 

J'ai expérimenté avec cet exemple pour un peu. Il compile et s'exécute, mais ne donne que les propriétés de B et ne marche pas sur l'arbre subClassOf. Je crois que j'ai manqué un paramètre de base ou l'utilisation du schéma RDF qui permet au raisonneur de faire son truc. Des indices?

public class jena2 { 
    private static void addRaw(OntModel m, String s, String p, String o) { 
    m.add(ResourceFactory.createStatement(
      new ResourceImpl(s),new PropertyImpl(p),new ResourceImpl(o)) 
     ); 
    } 

    public static void main(String[] args) { 
    OntModel model = ModelFactory.createOntologyModel(); 

    addRaw(model, "x:A", "rdf:type", "rdfs:Class"); 
    addRaw(model, "x:A", "x:prop1", "x:whatever"); 
    addRaw(model, "x:B", "rdf:type", "rdfs:Class"); 
    addRaw(model, "x:B", "x:prop2", "x:other"); 
    addRaw(model, "x:B", "rdfs:subClassOf", "x:A"); 
    addRaw(model, "x:widget", "rdf:type", "x:B"); 

    StringBuffer sb = new StringBuffer(); 

    sb.append("PREFIX x: <x:>"); 
    sb.append("PREFIX rdf: <rdf:>"); 
    sb.append("PREFIX rdfs: <rdfs:>"); 
    sb.append("SELECT *"); 
    sb.append("WHERE {"); 
    sb.append(" x:widget rdf:type ?type ."); 
    sb.append(" ?type ?props ?all ."); 
    sb.append("}"); 

    Query query = QueryFactory.create(sb.toString()); 
    try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) { 
     ResultSet results = qexec.execSelect() ; 
     for (; results.hasNext() ;) { 
      QuerySolution soln = results.nextSolution() ; 
      System.out.println(soln); 
     } 
     } catch(Exception e) { 
     System.out.println("epic fail: " + e); 
    } 

} 
+0

Ce code ne peut jamais fonctionner: vous ne pouvez pas ajouter d'instructions et simplement utiliser les URI préfixés - comment l'API doit-elle savoir à quel URI complet résoudre? Par exemple, vous ajoutez "x: A", "rdf: type", "rdfs: Class" '->" rdf: type "ne sera jamais résolu à l'adresse URI correcte' http://www.w3.org/ 1999/02/22-rdf-syntax-ns # type'. La même chose vaut pour tous les autres. Tous ceux qui n'ont pas de protocole spécifié seront résolus en URI local. – AKSW

+0

La même chose vaut pour la requête SPARQL: 'PREFIX rdfs: ' n'a rien à voir avec l'espace de noms RDFS, l'URI complète est nécessaire – AKSW

+0

@AKSW Oui; J'essayais juste de passer à RDF.type et à RDFS.subClassOf, etc. Je peux difficilement voir pourquoi j'ai besoin des URI complètes pour que le moteur de raisonnement fasse son truc (puisqu'il les cherche) mais ne devrait pas avoir mes propres classes se débrouiller avec un simple préfixe x: –

Répondre

2

(ceci est pas une réponse complète)

Comme par commentaire ci-dessus, un code de travail:

import org.apache.jena.ontology.OntModel; 
import org.apache.jena.query.*; 
import org.apache.jena.rdf.model.*; 
import org.apache.jena.vocabulary.RDF; 
import org.apache.jena.vocabulary.RDFS; 

public class jena2 { 

    private static void addRaw(OntModel m, Resource s, Property p, Resource o) { 
     m.add(ResourceFactory.createStatement(s, p, o)); 
    } 

    public static void main(String[] args) { 
     OntModel model = ModelFactory.createOntologyModel(); 

     Resource A = ResourceFactory.createResource("x:A"); 
     Resource B = ResourceFactory.createResource("x:B"); 
     Property prop1 = ResourceFactory.createProperty("x:prop1"); 
     Property prop2 = ResourceFactory.createProperty("x:prop2"); 
     Resource whatever = ResourceFactory.createResource("x:whatever"); 
     Resource other = ResourceFactory.createResource("x:other"); 
     Resource widget = ResourceFactory.createResource("x:widget"); 

     addRaw(model, A, RDF.type, RDFS.Class); 
     addRaw(model, A, prop1, whatever); 
     addRaw(model, B, RDF.type, RDFS.Class); 
     addRaw(model, B, prop2, other); 
     addRaw(model, B, RDFS.subClassOf, A); 
     addRaw(model, widget, RDF.type, B); 

     StringBuffer sb = new StringBuffer(); 

     sb.append("PREFIX x: <x:>"); 
     sb.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"); 
     sb.append("SELECT * {"); 
     sb.append(" x:widget rdf:type ?type ."); 
     sb.append(" ?type ?props ?all ."); 
     sb.append("}"); 

     Query query = QueryFactory.create(sb.toString()); 
     try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) { 
      ResultSet results = qexec.execSelect(); 
      for (; results.hasNext();) { 
       QuerySolution soln = results.nextSolution(); 
       System.out.println(soln); 
      } 
     } catch (Exception e) { 
      System.out.println("epic fail: " + e); 
     } 

    } 
} 

Sortie:

(?all = <x:A>) (?props = rdfs:subClassOf) -> (?type = <x:B>) -> [Root] 
(?all = <x:other>) (?props = <x:prop2>) -> (?type = <x:B>) -> [Root] 
(?all = rdfs:Class) (?props = rdf:type) -> (?type = <x:B>) -> [Root] 
(?all = <x:B>) (?props = rdfs:subClassOf) -> (?type = <x:B>) -> [Root] 
(?all = rdfs:Resource) (?props = rdfs:subClassOf) -> (?type = <x:B>) -> [Root] 
(?all = rdfs:Resource) (?props = rdf:type) -> (?type = <x:B>) -> [Root] 
(?all = rdfs:Class) (?props = rdf:type) -> (?type = rdfs:Resource) -> [Root] 
(?all = rdfs:Resource) (?props = rdfs:subClassOf) -> (?type = rdfs:Resource) -> [Root] 
(?all = rdfs:Resource) (?props = rdf:type) -> (?type = rdfs:Resource) -> [Root] 
(?all = rdfs:Resource) (?props = rdfs:subClassOf) -> (?type = <x:A>) -> [Root] 
(?all = <x:whatever>) (?props = <x:prop1>) -> (?type = <x:A>) -> [Root] 
(?all = rdfs:Class) (?props = rdf:type) -> (?type = <x:A>) -> [Root] 
(?all = <x:A>) (?props = rdfs:subClassOf) -> (?type = <x:A>) -> [Root] 
(?all = rdfs:Resource) (?props = rdf:type) -> (?type = <x:A>) -> [Root] 

Il a également des rendements les propriétés de la classe RDFS A

+0

Confirmer que vos recommandations fonctionnent. Merci beaucoup, et honte à moi d'avoir essayé de tricher avec les URI indésirables. BTW, je pense que la chaîne statique x est inutilisée. –