
org.coode.owlapi.obo.renderer.OBOFlatFileRenderer Maven / Gradle / Ivy
/*
* This file is part of the OWL API.
*
* The contents of this file are subject to the LGPL License, Version 3.0.
*
* Copyright (C) 2011, The University of Manchester
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
*
* Alternatively, the contents of this file may be used under the terms of the Apache License, Version 2.0
* in which case, the provisions of the Apache License Version 2.0 are applicable instead of those above.
*
* Copyright 2011, University of Manchester
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.coode.owlapi.obo.renderer;
import java.io.IOException;
import java.io.Writer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.coode.owlapi.obo.parser.OBOVocabulary;
import org.semanticweb.owlapi.io.AbstractOWLRenderer;
import org.semanticweb.owlapi.io.OWLRendererException;
import org.semanticweb.owlapi.io.XMLUtils;
import org.semanticweb.owlapi.model.AxiomType;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLAnnotation;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLClassAxiom;
import org.semanticweb.owlapi.model.OWLClassExpression;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLDataProperty;
import org.semanticweb.owlapi.model.OWLDataPropertyExpression;
import org.semanticweb.owlapi.model.OWLDataRange;
import org.semanticweb.owlapi.model.OWLDisjointClassesAxiom;
import org.semanticweb.owlapi.model.OWLEntity;
import org.semanticweb.owlapi.model.OWLEquivalentClassesAxiom;
import org.semanticweb.owlapi.model.OWLImportsDeclaration;
import org.semanticweb.owlapi.model.OWLIndividual;
import org.semanticweb.owlapi.model.OWLLiteral;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLObjectIntersectionOf;
import org.semanticweb.owlapi.model.OWLObjectProperty;
import org.semanticweb.owlapi.model.OWLObjectPropertyExpression;
import org.semanticweb.owlapi.model.OWLObjectUnionOf;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.OWLProperty;
import org.semanticweb.owlapi.model.OWLPropertyExpression;
import org.semanticweb.owlapi.model.OWLRestriction;
import org.semanticweb.owlapi.model.OWLSubClassOfAxiom;
import org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom;
import org.semanticweb.owlapi.model.SWRLRule;
import org.semanticweb.owlapi.util.CollectionFactory;
import org.semanticweb.owlapi.util.NamespaceUtil;
import org.semanticweb.owlapi.util.SimpleShortFormProvider;
import org.semanticweb.owlapi.util.VersionInfo;
import org.semanticweb.owlapi.vocab.OWLRDFVocabulary;
/**
* Renders OBO 1.2 flat file format. OBO 1.2 is a subset of OWL, so a rendering
* of an arbitrary OWL ontology may be incomplete in OBO. Several features are
* currently not implemented: - Exception handling for unsupported constructs -
* these are currently reported in stderr - axiom annotations (these might be
* serialisable as inline comments - although OBO parsers provide no guarantees
* these will be roundtripped) - anonymous classes/properties - it is not clear
* what this means in OBO - datatype restrictions - namespace and derived tags
* for relationships etc - it is not clear what this means in OBO - preservation
* of ordering on roundtripping exercises - Stanzas are ordered (classes,
* obj/data props then instances) - Entities are ordered by ID in each Stanza
* type - OBO tags are ordered WRT the OBO specifications Additional points: -
* cardinality is expressed as an '=' separated tag value pair in [1] and
* underspecified in [2]. OBOEdit 2 does not parse this (at the time of writing)
* so this has been changed to standard TVP syntax - OBO 1.2 currently specifies
* pairwise disjointness which this renderer follows so files may get large -
* Exceptions are caught along the way and then wrapped in an
* OBOStorageIncompleteException which is thrown after serialisation ends
* References: [1] http://www.cs.man.ac.uk/~horrocks/obo/ [2]
* http://www.geneontology.org/GO.format.obo-1_2.shtml
*
* @author Nick Drummond, The University Of Manchester, Bio Health Informatics
* Group, Date: Dec 17, 2008
*/
public class OBOFlatFileRenderer extends AbstractOWLRenderer implements
OBOExceptionHandler {
private OBORelationshipGenerator relationshipHandler;
private SimpleShortFormProvider sfp;
private String defaultPrefix;
private List exceptions = new ArrayList();
private NamespaceUtil nsUtil;
private String defaultNamespace;
private OWLDataFactory factory;
@Deprecated
@SuppressWarnings("unused")
protected OBOFlatFileRenderer(OWLOntologyManager owlOntologyManager) {
this();
}
protected OBOFlatFileRenderer() {
relationshipHandler = new OBORelationshipGenerator(this);
sfp = new SimpleShortFormProvider();
}
@Override
public void render(OWLOntology ontology, Writer writer)
throws OWLRendererException {
factory = ontology.getOWLOntologyManager().getOWLDataFactory();
exceptions.clear();
IRI ontologyIRI = ontology.getOntologyID().getOntologyIRI();
if (ontologyIRI != null) {
final String ontURIStr = ontologyIRI.toString();
if (ontURIStr.endsWith("/")) {
defaultNamespace = ontURIStr;
} else {
defaultNamespace = ontURIStr + "#";
}
} else {
defaultNamespace = "urn:defaultOBONamespace:ontology"
+ System.currentTimeMillis() + "#";
System.err
.println("WARNING: anonymous ontology saved in OBO format. Default namespace created for it.");
}
nsUtil = new NamespaceUtil();
defaultPrefix = nsUtil.getPrefix(defaultNamespace);
writeHeader(ontology, writer);
writeStanzas(ontology, writer);
if (!exceptions.isEmpty()) {
throw new OBOStorageIncompleteException(exceptions);
}
}
@Override
public void addException(OBOStorageException exception) {
exceptions.add(exception);
}
@Override
public List getExceptions() {
return exceptions;
}
private void writeHeader(OWLOntology ontology, Writer writer) {
OBOTagValuePairList tvpList = new OBOTagValuePairList(
OBOVocabulary.getHeaderTags());
tvpList.setDefault(OBOVocabulary.DEFAULT_NAMESPACE, defaultPrefix);
for (OWLAnnotation ax : ontology.getAnnotations()) {
if (ax.getProperty().isComment()) {
tvpList.addPair(OBOVocabulary.REMARK,
((OWLLiteral) ax.getValue()).getLiteral());
} else {
tvpList.visit(ax);
}
}
for (OWLImportsDeclaration importDecl : ontology
.getImportsDeclarations()) {
tvpList.addPair(OBOVocabulary.IMPORT, importDecl.getIRI()
.toString());
}
Map namespace2PrefixMap = loadUsedNamespaces(ontology);
for (String namespace : namespace2PrefixMap.keySet()) {
String mapping = namespace2PrefixMap.get(namespace) + " "
+ namespace;
tvpList.addPair(OBOVocabulary.ID_SPACE, mapping);
}
// overwrite the existing values for below
tvpList.setPair(OBOVocabulary.FORMAT_VERSION, "1.2");
tvpList.setPair(
OBOVocabulary.DATE,
getTimestampFormatter().format(
new Date(System.currentTimeMillis())));
tvpList.setPair(OBOVocabulary.SAVED_BY, System.getProperty("user.name"));
tvpList.setPair(OBOVocabulary.AUTO_GENERATED_BY, VersionInfo
.getVersionInfo().toString());
tvpList.write(writer);
}
private Map loadUsedNamespaces(OWLOntology ontology) {
for (OWLEntity entity : ontology.getSignature()) {
final IRI base = IRI.create(XMLUtils.getNCNamePrefix(entity
.getIRI().toString()));
nsUtil.getPrefix(base.toString());
}
return nsUtil.getNamespace2PrefixMap();
}
private void writeStanzas(OWLOntology ontology, Writer writer) {
write("\n\n! ---------------------- CLASSES -------------------------\n",
writer);
final List sortedClasses = new ArrayList(
ontology.getClassesInSignature());
CollectionFactory.sortOptionally(sortedClasses);
for (OWLClass cls : sortedClasses) {
writeTermStanza(cls, ontology, writer);
}
write("\n\n! ---------------------- PROPERTIES -------------------------\n",
writer);
final List objProps = new ArrayList(
ontology.getObjectPropertiesInSignature());
CollectionFactory.sortOptionally(objProps);
for (OWLObjectProperty property : objProps) {
writeTypeDefStanza(property, ontology, writer);
}
final List dataProps = new ArrayList(
ontology.getDataPropertiesInSignature());
CollectionFactory.sortOptionally(dataProps);
for (OWLDataProperty property : dataProps) {
writeTypeDefStanza(property, ontology, writer);
}
write("\n\n! ---------------------- INSTANCES -------------------------\n",
writer);
final List individuals = new ArrayList(
ontology.getIndividualsInSignature());
CollectionFactory.sortOptionally(individuals);
for (OWLNamedIndividual individual : individuals) {
writeInstanceStanza(individual, ontology, writer);
}
// scan ontology for other constructs that cannot be translated
for (OWLClassAxiom ax : ontology.getGeneralClassAxioms()) {
if (ax instanceof OWLSubClassOfAxiom) {
exceptions
.add(new OBOStorageException(ax, null,
"Superclass GCI found in ontology cannot be translated to OBO"));
}
if (ax instanceof OWLEquivalentClassesAxiom) {
exceptions
.add(new OBOStorageException(ax, null,
"Equivalent class GCI found in ontology cannot be translated to OBO"));
}
if (ax instanceof OWLDisjointClassesAxiom) {
exceptions
.add(new OBOStorageException(ax, null,
"Disjoint axiom contains anonymous classes - cannot be translated to OBO"));
}
}
for (SWRLRule r : ontology.getAxioms(AxiomType.SWRL_RULE)) {
exceptions.add(new OBOStorageException(r, null,
"SWRL rules cannot be translated to OBO"));
}
}
private void writeTermStanza(OWLClass cls, OWLOntology ontology,
Writer writer) {
write("\n[", writer);
write(OBOVocabulary.TERM.getName(), writer);
write("]\n", writer);
// TODO is_anonymous??
OBOTagValuePairList tvpList = new OBOTagValuePairList(
OBOVocabulary.getTermStanzaTags());
handleEntityBase(cls, ontology, tvpList);
relationshipHandler.setClass(cls);
for (OWLClassExpression superCls : cls.getSuperClasses(ontology)) {
if (!superCls.isAnonymous()) {
String superclassID = getID(superCls.asOWLClass());
tvpList.addPair(OBOVocabulary.IS_A, superclassID);
// TODO handle namespace and derived?
} else if (superCls instanceof OWLRestriction) {
// TODO handle datatype restrictions
superCls.accept(relationshipHandler);
} else {
exceptions
.add(new OBOStorageException(cls, superCls,
"OBO format only supports named superclass or someValuesFrom restrictions"));
}
}
final OWLClass owlThing = factory.getOWLThing();
// if no named superclass is specified, then this must be asserted to be
// a subclass of owlapi:Thing
if (!cls.equals(owlThing)
&& tvpList.getValues(OBOVocabulary.IS_A).isEmpty()) {
tvpList.addPair(OBOVocabulary.IS_A, getID(owlThing));
}
for (OWLClassExpression equiv : cls.getEquivalentClasses(ontology)) {
if (equiv instanceof OWLObjectIntersectionOf) {
handleIntersection(cls, (OWLObjectIntersectionOf) equiv,
tvpList);
} else if (equiv instanceof OWLObjectUnionOf) {
handleUnion(cls, (OWLObjectUnionOf) equiv, tvpList);
} else if (equiv instanceof OWLRestriction) {
/*
* OBO equivalence must be of the form "A and p some B and ..."
* if this class is equiv to a restriction, put this into an
* intersection with owlapi:Thing as the named class
*/
OWLObjectIntersectionOf intersection = factory
.getOWLObjectIntersectionOf(owlThing, equiv);
handleIntersection(cls, intersection, tvpList);
} else {
// TODO handle datatype restrictions
exceptions
.add(new OBOStorageException(cls, equiv,
"Cannot answer equivalent class that is not intersection or union"));
}
}
for (OWLClassExpression disjoint : cls.getDisjointClasses(ontology)) {
if (!disjoint.isAnonymous()) {
tvpList.addPair(OBOVocabulary.DISJOINT_FROM,
getID(disjoint.asOWLClass()));
// TODO handle namespace and derived
} else {
exceptions
.add(new OBOStorageException(cls, disjoint,
"Found anonymous disjoint class that cannot be represented in OBO"));
}
}
for (OBORelationship relationship : relationshipHandler
.getOBORelationships()) {
// TODO handle datatype restrictions
handleRelationship(relationship, tvpList);
}
tvpList.write(writer);
}
private void
handleIntersection(OWLClass cls,
OWLObjectIntersectionOf intersectionOf,
OBOTagValuePairList tvpList) {
for (OWLClassExpression op : intersectionOf.getOperands()) {
if (!op.isAnonymous()) {
tvpList.addPair(OBOVocabulary.INTERSECTION_OF,
getID(op.asOWLClass()));
} else {
relationshipHandler.setClass(cls);
op.accept(relationshipHandler);
Set relations = relationshipHandler
.getOBORelationships();
if (!relations.isEmpty()) {
OBORelationship rel = relations.iterator().next();
tvpList.addPair(OBOVocabulary.INTERSECTION_OF,
renderRestriction(rel));
} else {
exceptions
.add(new OBOStorageException(cls, op,
"Found operand in intersection that cannot be represented"));
}
}
}
// TODO handle namespace
}
private String renderRestriction(OBORelationship rel) {
StringBuilder sb = new StringBuilder(getID(rel.getProperty()));
sb.append(" ");
sb.append(getID(rel.getFiller()));
return sb.toString();
}
private void handleUnion(OWLClass cls, OWLObjectUnionOf union,
OBOTagValuePairList tvpList) {
for (OWLClassExpression op : union.getOperands()) {
if (!op.isAnonymous()) {
tvpList.addPair(OBOVocabulary.UNION_OF, getID(op.asOWLClass()));
} else {
relationshipHandler.setClass(cls);
op.accept(relationshipHandler);
Set relations = relationshipHandler
.getOBORelationships();
if (!relations.isEmpty()) {
OBORelationship rel = relations.iterator().next();
tvpList.addPair(OBOVocabulary.UNION_OF,
renderRestriction(rel));
} else {
exceptions
.add(new OBOStorageException(cls, op,
"Found operand in union that cannot be represented"));
}
}
}
}
private void handleRelationship(OBORelationship relationship,
OBOTagValuePairList tvpList) {
StringBuilder sb = new StringBuilder();
sb.append(renderRestriction(relationship));
sb.append("\n");
if (relationship.getCardinality() >= 0) {
sb.append(OBOVocabulary.CARDINALITY.getName());
sb.append(":");
sb.append(Integer.toString(relationship.getCardinality()));
sb.append("\n");
}
if (relationship.getMaxCardinality() >= 0) {
sb.append(OBOVocabulary.MAX_CARDINALITY.getName());
sb.append(":");
sb.append(Integer.toString(relationship.getMaxCardinality()));
sb.append("\n");
}
if (relationship.getMinCardinality() >= 0) {
sb.append(OBOVocabulary.MIN_CARDINALITY.getName());
sb.append(":");
sb.append(Integer.toString(relationship.getMinCardinality()));
sb.append("\n");
}
tvpList.addPair(OBOVocabulary.RELATIONSHIP, sb.toString());
}
private OBOTagValuePairList
handleCommonTypeDefStanza(P property, OWLOntology ontology,
Writer writer) {
write("\n[", writer);
write(OBOVocabulary.TYPEDEF.getName(), writer);
write("]\n", writer);
OBOTagValuePairList tvpList = new OBOTagValuePairList(
OBOVocabulary.getTypeDefStanzaTags());
handleEntityBase(property, ontology, tvpList);
Set domains = property.getDomains(ontology);
for (OWLClassExpression domain : domains) {
if (!domain.isAnonymous()) {
tvpList.addPair(OBOVocabulary.DOMAIN,
getID(domain.asOWLClass()));
} else {
exceptions.add(new OBOStorageException(property, domain,
"Anonymous domain that cannot be represented in OBO"));
}
}
final Set> sp = property
.getSuperProperties(ontology);
for (OWLPropertyExpression, ?> superProp : sp) {
if (!superProp.isAnonymous()) {
tvpList.addPair(OBOVocabulary.IS_A,
getID((OWLProperty) superProp));
} else {
exceptions
.add(new OBOStorageException(property, superProp,
"Anonymous property in superProperty is not supported in OBO"));
}
}
tvpList.setDefault(OBOVocabulary.IS_METADATA_TAG, "false"); // annotation
// properties
// only
return tvpList;
}
private void writeTypeDefStanza(OWLObjectProperty property,
OWLOntology ontology, Writer writer) {
OBOTagValuePairList tvpList = handleCommonTypeDefStanza(property,
ontology, writer);
for (OWLClassExpression range : property.getRanges(ontology)) {
if (!range.isAnonymous()) {
tvpList.addPair(OBOVocabulary.RANGE, getID(range.asOWLClass()));
} else {
exceptions.add(new OBOStorageException(property, range,
"Anonymous range that cannot be represented in OBO"));
}
}
if (property.isAsymmetric(ontology)) {
tvpList.addPair(OBOVocabulary.IS_ASYMMETRIC, "true");
}
if (property.isReflexive(ontology)) {
tvpList.addPair(OBOVocabulary.IS_REFLEXIVE, "true");
}
if (property.isSymmetric(ontology)) {
tvpList.addPair(OBOVocabulary.IS_SYMMETRIC, "true");
}
if (property.isTransitive(ontology)) {
tvpList.addPair(OBOVocabulary.IS_TRANSITIVE, "true");
}
for (OWLObjectPropertyExpression inv : property.getInverses(ontology)) {
if (!inv.isAnonymous()) {
tvpList.addPair(OBOVocabulary.INVERSE,
getID(inv.asOWLObjectProperty()));
} else {
exceptions
.add(new OBOStorageException(property, inv,
"Anonymous property in inverse is not supported in OBO"));
}
}
// transitive over
for (OWLSubPropertyChainOfAxiom ax : ontology
.getAxioms(AxiomType.SUB_PROPERTY_CHAIN_OF)) {
if (ax.getSuperProperty().equals(property)) {
final List chain = ax
.getPropertyChain();
if (chain.size() == 2 && chain.get(0).equals(property)
&& !chain.get(1).isAnonymous()) {
tvpList.addPair(OBOVocabulary.TRANSITIVE_OVER, getID(chain
.get(1).asOWLObjectProperty()));
} else {
exceptions
.add(new OBOStorageException(property, ax,
"Only property chains of form 'p o q -> p' supported"));
}
}
}
// TODO is RELATIONSHIP really a part of the typedef stanza?
tvpList.write(writer);
}
private void writeTypeDefStanza(OWLDataProperty property,
OWLOntology ontology, Writer writer) {
OBOTagValuePairList tvpList = handleCommonTypeDefStanza(property,
ontology, writer);
for (OWLDataRange range : property.getRanges(ontology)) {
if (range.isDatatype()) {
tvpList.addPair(OBOVocabulary.RANGE, range.asOWLDatatype()
.getIRI().toString());
} else {
exceptions.add(new OBOStorageException(property, range,
"Complex data range cannot be represented in OBO"));
}
}
// TODO is RELATIONSHIP really a part of the typedef stanza?
tvpList.write(writer);
}
private void writeInstanceStanza(OWLNamedIndividual individual,
OWLOntology ontology, Writer writer) {
write("\n[", writer);
write(OBOVocabulary.INSTANCE.getName(), writer);
write("]\n", writer);
OBOTagValuePairList tvpList = new OBOTagValuePairList(
OBOVocabulary.getInstanceStanzaTags());
if (individual.isAnonymous()) {
tvpList.setDefault(OBOVocabulary.IS_ANONYMOUS, "true");
}
handleEntityBase(individual, ontology, tvpList);
for (OWLClassExpression type : individual.getTypes(ontology)) {
if (!type.isAnonymous()) {
tvpList.addPair(OBOVocabulary.INSTANCE_OF,
getID(type.asOWLClass()));
} else {
exceptions.add(new OBOStorageException(individual, type,
"Complex types cannot be represented in OBO"));
}
}
Map> objPropAssertions = individual
.getObjectPropertyValues(ontology);
for (OWLObjectPropertyExpression p : objPropAssertions.keySet()) {
if (!p.isAnonymous()) {
for (OWLIndividual ind : objPropAssertions.get(p)) {
if (!ind.isAnonymous()) {
final String rel = renderRestriction(new OBORelationship(
p.asOWLObjectProperty(),
ind.asOWLNamedIndividual()));
tvpList.addPair(OBOVocabulary.PROPERTY_VALUE, rel);
}
}
} else {
exceptions
.add(new OBOStorageException(individual, p,
"Anonymous property in assertion is not supported in OBO"));
}
}
Map> dataPropAssertions = individual
.getDataPropertyValues(ontology);
for (OWLDataPropertyExpression p : dataPropAssertions.keySet()) {
if (!p.isAnonymous()) {
for (OWLLiteral literal : dataPropAssertions.get(p)) {
final String rel = renderPropertyAssertion(
p.asOWLDataProperty(), literal);
tvpList.addPair(OBOVocabulary.PROPERTY_VALUE, rel);
}
} else {
// no anonymous data properties so this should never occur
exceptions
.add(new OBOStorageException(individual, p,
"Anonymous property in assertion is not supported in OBO"));
}
}
tvpList.write(writer);
}
private void handleEntityBase(OWLEntity entity, OWLOntology ontology,
OBOTagValuePairList tvpList) {
tvpList.addPair(OBOVocabulary.ID, getID(entity));
Set potentialNames = new HashSet();
for (OWLAnnotation annotation : entity.getAnnotations(ontology)) {
if (annotation.getProperty().getIRI()
.equals(OWLRDFVocabulary.RDFS_LABEL.getIRI())) {
potentialNames.add(annotation);
} else if (annotation.getProperty().isComment()) {
tvpList.addPair(OBOVocabulary.COMMENT,
((OWLLiteral) annotation.getValue()).getLiteral());
} else {
tvpList.visit(annotation);
}
}
if (tvpList.getValues(OBOVocabulary.NAME).isEmpty()) { // one name
// required!!
if (!potentialNames.isEmpty()) {
OWLAnnotation firstLabel = potentialNames.iterator().next();
tvpList.addPair(OBOVocabulary.NAME,
((OWLLiteral) firstLabel.getValue()).getLiteral());
potentialNames.remove(firstLabel);
} else {
tvpList.addPair(OBOVocabulary.NAME, getID(entity));
}
}
// other labels just get rendered as label
for (OWLAnnotation anno : potentialNames) {
tvpList.visit(anno);
}
final String uri = entity.getIRI().toString();
if (!uri.startsWith(defaultNamespace)) {
final IRI base = IRI.create(XMLUtils.getNCNamePrefix(uri));
String prefix = nsUtil.getPrefix(base.toString());
tvpList.setDefault(OBOVocabulary.NAMESPACE, prefix);
}
}
private String renderPropertyAssertion(OWLDataProperty property,
OWLLiteral literal) {
StringBuilder sb = new StringBuilder(getID(property));
sb.append(" \"");
sb.append(literal.getLiteral());
sb.append("\" ");
if (!literal.isRDFPlainLiteral()) {
sb.append(literal.getDatatype().getIRI());
}
return sb.toString();
}
private String getID(OWLEntity entity) {
return sfp.getShortForm(entity);
}
private void write(String s, Writer writer) {
try {
writer.write(s);
} catch (IOException e) {
e.printStackTrace();
}
}
private DateFormat getTimestampFormatter() {
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("dd:MM:yyyy HH:mm");
return sdf;
}
}