Добавьте RDF-тройку в онтологию совы (OWL API 4.3.0)
Я хотел бы добавить некоторую тройку RDF из файла xls в онтологию OWL RDF/XML с использованием OWL API. Я следую этой теме и могу сделать это с OWL API v 3.4, но я не могу сделать это с v4.3 (и все остальные мои программы используют v4.3).
Вот код темы выше, работающей для версии 3.4:
import java.io.Reader;
import org.coode.owlapi.rdfxml.parser.OWLRDFConsumer;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLDataProperty;
import org.semanticweb.owlapi.model.OWLEntity;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLObjectProperty;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyLoaderConfiguration;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;
import uk.ac.manchester.cs.owl.owlapi.turtle.parser.TurtleParser;
public class ExampleOWLRDFConsumer {
public static void main(String[] args) throws OWLOntologyCreationException, OWLOntologyStorageException {
// Create an ontology.
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
OWLDataFactory factory = manager.getOWLDataFactory();
OWLOntology ontology = manager.createOntology();
// Create some named individuals and an object property.
String ns = "http://example.org/";
OWLNamedIndividual tom = factory.getOWLNamedIndividual(IRI.create(ns + "Tom"));
OWLObjectProperty likes = factory.getOWLObjectProperty(IRI.create(ns + "likes"));
OWLDataProperty age = factory.getOWLDataProperty(IRI.create(ns + "age"));
OWLNamedIndividual anna = factory.getOWLNamedIndividual(IRI.create(ns + "Anna"));
// Add the declarations axioms to the ontology so that the triples involving
// these are understood (otherwise the triples will be ignored).
for (OWLEntity entity : new OWLEntity[] {tom, likes, age, anna}) {
manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(entity));
}
// Print the the ontology to see that the entities are declared.
// The important result is
// <NamedIndividual rdf:about="http://example.org/Tom"/>
// with no properties
manager.saveOntology(ontology, System.out);
// Create an OWLRDFConsumer for the ontology.
OWLRDFConsumer consumer = new OWLRDFConsumer(ontology, new TurtleParser((Reader) null), new OWLOntologyLoaderConfiguration());
// The consumer handles (IRI,IRI,IRI) and (IRI,IRI,OWLLiteral) triples.
consumer.handle(tom.getIRI(), likes.getIRI(), anna.getIRI());
consumer.handle(tom.getIRI(), age.getIRI(), factory.getOWLLiteral(35));
// Print the ontology to see the new object and data property assertions. The import contents is
// still Tom:
// <NamedIndividual rdf:about="http://example.org/Tom">
// <example:age rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">35</example:age>
// <example:likes rdf:resource="http://example.org/Anna"/>
// </NamedIndividual>
manager.saveOntology(ontology, System.out);
}
}
Я знаю, что некоторые пакеты изменились с v3.X до 4.X и кажется, что TurtleParser больше не является AnonymousNodeChecker? В этом примере потребитель не обрабатывает 2 RDF-Triple в v4.3. Если кому-то удастся запустить этот пример и напечатать два отношения (OWLObjectProperty / OWLDataproperty), было бы неплохо =). Моя зависимость:
<parent>
<artifactId>owlapi-parent</artifactId>
<groupId>net.sourceforge.owlapi</groupId>
<version>4.3.0</version>
</parent>
<dependency>
<groupId>net.sourceforge.owlapi</groupId>
<artifactId>owlapi-compatibility</artifactId>
<version>4.3.0</version>
</dependency>
Большое спасибо.
PS: я француз, извините, если мой синтаксис не идеален
2 ответа
OWLAPI не ориентирован на RDF, и, как следствие, связанные с RDF классы предназначены только для его инфраструктуры анализа, а не для использования ввода - поэтому интерфейсы и реализации могут изменяться без предупреждения.
В этом случае вы можете обойти проблему, используя только интерфейсы API-модуля. Тройки, которые вы добавляете, являются утверждениями свойств объекта и данных и могут быть созданы как таковые с помощью OWLDataFactory
пример.
manager.addAxiom(factory.getOWLObjectPropertyAssertionAxiom(likes, tom, anna);
manager.addAxiom(factory.getOWLDataPropertyAssertionAxiom(age, tom, factory.getOWLLiteral(35));
Код, который я использую, чтобы прочитать в своем файле Excel, сгенерировать тройку и добавить ее в мою целевую онтологию:
import java.io.File;
import java.io.FileInputStream;
import java.io.Reader;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.coode.owlapi.rdfxml.parser.OWLRDFConsumer;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyFormat;
import org.semanticweb.owlapi.model.OWLOntologyLoaderConfiguration;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import uk.ac.manchester.cs.owl.owlapi.turtle.parser.TurtleParser;
public class ReadExcelFile {
public static void main(String[] args){
try {
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("./data/ReadExcelTest.xls"));
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFRow row;
HSSFCell cell;
String object = null;
String predicat = null;
String subject = null;
String[] data = null;
Object objSubject = null;
Object objPredicat = null;
Object objObject = null;
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
OWLDataFactory df = OWLManager.getOWLDataFactory();
OWLOntology o = manager.loadOntologyFromOntologyDocument(new File("./targetOntology.owl"));
IRI targetOntologyIRI= IRI.create("http://targetOntology#");
IRI cntroIRI = IRI.create("http://informatics.mayo.edu/CNTRO#");
IRI rdfsIRI = IRI.create("http://www.w3.org/2000/01/rdf-schema#");
IRI rdfIRI = IRI.create("http://www.w3.org/1999/02/22-rdf-syntax-ns#");
IRI owlIRI = IRI.create("http://www.w3.org/2002/07/owl#");
int rows = sheet.getPhysicalNumberOfRows();
int cols = 3;
//Creation objet Triple
for(int r = 1; r < rows; r++) {
row = sheet.getRow(r);
if(row != null) {
Triple triple = new Triple(subject, predicat, object);
for(int c = 0; c < cols; c++) {
cell = row.getCell(c);
if(cell != null) {
if(c == 0) {
triple.setSubject(cell.getStringCellValue());
}if(c == 1) {
triple.setPredicat(cell.getStringCellValue());
}if(c == 2) {
triple.setObject(cell.getStringCellValue());
}
}
}
objSubject = getIRIFromPrefixName(triple.getSubject());
objPredicat = getIRIFromPrefixName(triple.getPredicat());
objObject = getIRIFromPrefixName(triple.getObject());
OWLRDFConsumer consumer = new OWLRDFConsumer(o, new TurtleParser((Reader) null), new OWLOntologyLoaderConfiguration() );
if (objObject.getClass() == String.class){
consumer.handle((IRI) objSubject, (IRI) objPredicat, df.getOWLLiteral((String) objObject));
} else {
consumer.handle((IRI) objSubject, (IRI) objPredicat, (IRI) objObject);
}
System.out.println(objSubject.toString() + " " + objPredicat.toString() + " " + objObject.toString());
System.out.println(" " + consumer.getLastAddedAxiom());
}
}
OWLOntologyFormat format = manager.getOntologyFormat(o);
Path path_instanced_ontology = Paths.get("./data/instanciedTargetOntology.owl");
File instanced_ontology = new File(path_instanced_ontology.toString());
manager.saveOntology(o, format, IRI.create(instanced_ontology.toURI()));
} catch(Exception ioe) {
ioe.printStackTrace();
}
}
И метод, который преобразует строку в IRI, если она имеет префикс в.
static Object getIRIFromPrefixName(String attribute){
IRI targetOntologyIRI= IRI.create("http://targetOntology#");
IRI cntroIRI = IRI.create("http://informatics.mayo.edu/CNTRO#");
IRI rdfsIRI = IRI.create("http://www.w3.org/2000/01/rdf-schema#");
IRI rdfIRI = IRI.create("http://www.w3.org/1999/02/22-rdf-syntax-ns#");
IRI owlIRI = IRI.create("http://www.w3.org/2002/07/owl#");
String[] data;
IRI iriAttribute = null;
if (attribute.contains("CNTRO:")){
data = attribute.split(":");
iriAttribute = IRI.create(cntroIRI + data[1]);
return iriAttribute;
} else if (attribute.contains("MEO:")){
data = attribute.split(":");
iriAttribute = IRI.create(eventOntologyIRI + data[1]);
return iriAttribute;
} else if (attribute.contains("rdfs:")){
data = attribute.split(":");
iriAttribute = IRI.create(rdfsIRI + data[1]);
return iriAttribute;
} else if (attribute.contains("rdf:")){
data = attribute.split(":");
iriAttribute = IRI.create(rdfIRI + data[1]);
return iriAttribute;
} else if (attribute.contains("owl:")){
data = attribute.split(":");
iriAttribute = IRI.create(owlIRI + data[1]);
return iriAttribute;
}
return attribute;
}
И Тройной класс:
public class Triple {
private String subject;
private String predicat;
private String object;
public Triple(String subject, String predicat, String object) {
super();
this.subject = subject;
this.predicat = predicat;
this.object = object;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getPredicat() {
return predicat;
}
public void setPredicat(String predicat) {
this.predicat = predicat;
}
public String getObject() {
return object;
}
public void setObject(String object) {
this.object = object;
}
}