Как мне рассмотреть отношения подклассов в SPARQL с использованием Apache Jena? - PullRequest
0 голосов
/ 28 июня 2019

Я хотел бы добавить новый подкласс в существующую онтологию.С помощью следующего кода JAVA с использованием Apache Jena и ru.avicomp.ontapi я уже могу загружать онтологию и манипулировать данными.

import java.io.File;

import org.apache.jena.update.UpdateAction;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;

import ru.avicomp.ontapi.OntManagers;
import ru.avicomp.ontapi.OntologyManager;
import ru.avicomp.ontapi.OntologyModel;
import ru.avicomp.ontapi.jena.model.OntGraphModel;

public class OntologyManipulator {

    OntGraphModel _base;
    private OntologyManager manager;
    private OntologyModel _ontology;

    private String _uri = "http://www.co-ode.org/ontologies/pizza/2.0.0";
    String _ns = _uri+"#";
    String _prefixRDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
    String _prefixEX = _ns;

    public OntologyManipulator() {

    }

    // reads the ontology into jena
    public void loadOntology(String path) {
        manager = OntManagers.createONT();
        try {
            _ontology = manager.loadOntologyFromOntologyDocument(new File(path));

            _base = _ontology.asGraphModel();

        } catch (OWLOntologyCreationException e) {
            e.printStackTrace();
        }
    }

    private void execSPARQLquery(String _query) {
        UpdateAction.parseExecute(_query, _base);

        _ontology.axioms().forEach(System.out::println);
        try {
            // write update to .owl ontology file
            _ontology.saveOntology();
        } catch (OWLOntologyStorageException e) {
            e.printStackTrace();
        }

        System.out.println("Statement successfully executed.");
    }

    // adds a new Individual to existing pizza.owl ontology
    public void addItemToOntology() {
        String toolName = "Sweden";
        String title = "DescribingTheTitle";
        String description = "DescribingTheIndividual";
        String parentitem = "Country";

        //check if tool exists in current ontology, otherwise delete it
        String deleteclause = "";

        // SPARQL Query:
        String _query = "PREFIX rdf:     <" + _prefixRDF + "> \n" + "PREFIX owl:     <http://www.w3.org/2002/07/owl#>\n"
                + "PREFIX ex:      <" + _prefixEX + "> \n" + deleteclause + "INSERT {ex:" + toolName + " ex:title \""
                + title + "\" ;" + "ex:description \"" + description + "\" ;" + "rdf:type owl:NamedIndividual; rdfs:subClassOf rdf:resource=\"#Country\";"
                + "  .  }\n" + "WHERE { }";

        System.out.println("QUERY: " + _query);
        // parse and execute SPARQL query
        execSPARQLquery(_query);

    }

}

В настоящее время мой SPARQL выглядит следующим образом и работает:

PREFIX rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX owl:     <http://www.w3.org/2002/07/owl#>
PREFIX ex:      <http://www.co-ode.org/ontologies/pizza/pizza.owl#> 
INSERT {ex:Sweden ex:title "DescribingTheTitle" ;ex:description "DescribingTheIndividual" ;rdf:type owl:NamedIndividual;  .  }
WHERE { }

Protégé распознал вставку и показывает это после выполнения оператора.К сожалению, шрифт не выделен жирным шрифтом, как и другие люди, так как нет отношения подкласса, например:

Protégé (IST) Protege_NOW

Как мнеРассмотрим отношения с подклассами в моем SPARQL, так что после слов онтология может выглядеть так в Protégé?

Протеже (SOLL) Protege_NTH

Я также пытался вставить что-то вроде

rdfs:subClassOf rdf:resource=\"#Country\" 

в мое предложение INSERT.При этом я получаю только следующее исключение:

org.apache.jena.query.QueryException: Line 4, column 122: Unresolved prefixed name: rdfs:subClassOf
    at org.apache.jena.sparql.lang.ParserSPARQL11Update._parse(ParserSPARQL11Update.java:75)
    at org.apache.jena.sparql.lang.ParserSPARQL11Update.parse$(ParserSPARQL11Update.java:40)
    at org.apache.jena.sparql.lang.UpdateParser.parse(UpdateParser.java:39)
    at org.apache.jena.update.UpdateFactory.make(UpdateFactory.java:87)
    at org.apache.jena.update.UpdateFactory.create(UpdateFactory.java:78)
    at org.apache.jena.update.UpdateFactory.create(UpdateFactory.java:56)
    at org.apache.jena.update.UpdateFactory.create(UpdateFactory.java:46)
    at org.apache.jena.update.UpdateAction.parseExecute(UpdateAction.java:136)
    at org.apache.jena.update.UpdateAction.parseExecute(UpdateAction.java:118)
    at org.apache.jena.update.UpdateAction.parseExecute(UpdateAction.java:109)
    at OntologyManipulator.execSPARQLquery(OntologyManipulator.java:27)

Я прочитал несколько других вопросов, связанных с SPARQL, но, похоже, никто не подходит к моему шаблону запроса, также официальный SPARQL кажется довольно плохим относительно INSERTоперации.Почему?

Буду благодарен, если кто-нибудь поможет мне понять, как отношения подкласса могут рассматриваться в SPARQL.

...