Я хотел бы добавить новый подкласс в существующую онтологию.С помощью следующего кода 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)
Как мнеРассмотрим отношения с подклассами в моем SPARQL, так что после слов онтология может выглядеть так в Protégé?
Протеже (SOLL)
Я также пытался вставить что-то вроде
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.