All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.clarkparsia.pellint.rdfxml.OWLSyntaxChecker Maven / Gradle / Ivy

The newest version!
// Copyright (c) 2006 - 2008, Clark & Parsia, LLC. 
// This source code is available under the terms of the Affero General Public License v3.
//
// Please see LICENSE.txt for full license terms, including the availability of proprietary exceptions.
// Questions, comments, or requests for clarification: [email protected]

package com.clarkparsia.pellint.rdfxml;

import java.net.URI;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.mindswap.pellet.jena.vocabulary.OWL2;
import org.mindswap.pellet.jena.vocabulary.SWRL;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.vocab.Namespaces;
import org.semanticweb.owlapi.vocab.OWLFacet;
import org.semanticweb.owlapi.vocab.SWRLBuiltInsVocabulary;
import org.semanticweb.owlapi.vocab.XSDVocabulary;

import com.clarkparsia.pellint.util.CollectionUtil;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.vocabulary.OWL;
import com.hp.hpl.jena.vocabulary.RDF;
import com.hp.hpl.jena.vocabulary.RDFS;

/**
 * 

* Title: *

*

* Description: *

*

* Copyright: Copyright (c) 2008 *

*

* Company: Clark & Parsia, LLC. *

* * @author Evren Sirin, Harris Lin */ public class OWLSyntaxChecker { /* * predicates related to restrictions (owl:onProperty, owl:allValuesFrom, * etc.) are preprocessed before all the triples are processed. these * predicates are stored in the following list so processTriples function * can ignore the triples with these predicates */ final static Collection RESTRICTION_PROPS; final static Collection DATA_RANGE_FACETS; final static Collection SWRL_BUILT_INS; static { RESTRICTION_PROPS = Arrays.asList( OWL.onProperty, OWL.hasValue, OWL.allValuesFrom, OWL.someValuesFrom, OWL.minCardinality, OWL2.minQualifiedCardinality, OWL.maxCardinality, OWL2.maxQualifiedCardinality, OWL.cardinality, OWL2.qualifiedCardinality, OWL2.hasSelf); DATA_RANGE_FACETS = CollectionUtil.makeSet(); for( OWLFacet v : OWLFacet.values() ) { DATA_RANGE_FACETS.add( ResourceFactory.createResource( v.getIRI().toString() ) ); } SWRL_BUILT_INS = CollectionUtil.makeSet(); for( SWRLBuiltInsVocabulary v : SWRLBuiltInsVocabulary.values() ) { SWRL_BUILT_INS.add( ResourceFactory.createResource( v.getURI().toString() ) ); } } private Map> m_Lists; private OWLEntityDatabase m_OWLEntities; private RDFModel m_Model = null; private boolean excludeValidPunnings = false; /** * Sets if valid punninga will be excluded from lint report. OWL 2 allows resources to have certain multiple types * (known as punning), e.g. a resource can be both a class and an individual. However, certain punnings are not * allowed under any condition, e.g. a resource cannot be both a datatype property and an object property. Invalid * punnings are always returned. If this option is set to true, punnings valid for OWL 2 will be * excluded from the report. By default, these punnings are reported. * * @param excludeValidPunning * If true OWL 2 valid punnings will not be inluded in the result */ public void setExcludeValidPunnings(boolean excludeValidPunning) { this.excludeValidPunnings = excludeValidPunning; } /** * Returns if valid punninga will be excluded from lint report. */ public boolean isExcludeValidPunnings() { return excludeValidPunnings; } public RDFLints validate(RDFModel model) { m_Model = model; m_OWLEntities = new OWLEntityDatabase(); m_OWLEntities.addAnnotationRole( RDFS.label ); m_OWLEntities.addAnnotationRole( RDFS.comment ); m_OWLEntities.addAnnotationRole( RDFS.seeAlso ); m_OWLEntities.addAnnotationRole( RDFS.isDefinedBy ); m_OWLEntities.addAnnotationRole( OWL.versionInfo ); m_OWLEntities.addOntologyRole( OWL.backwardCompatibleWith ); m_OWLEntities.addOntologyRole(OWL.priorVersion ); m_OWLEntities.addOntologyRole( OWL.incompatibleWith ); m_OWLEntities.addClass( OWL.Thing ); m_OWLEntities.addClass( OWL.Nothing ); // Fixes #194 m_OWLEntities.addDatatype( RDFS.Literal ); // Fixes #457 m_OWLEntities.addDatatype( ResourceFactory.createResource("http://www.w3.org/1999/02/22-rdf-syntax-ns#PlainLiteral")); for( XSDVocabulary uri : XSDVocabulary.values() ) { m_OWLEntities.addDatatype( ResourceFactory.createResource( uri.getIRI().toString() ) ); } m_Lists = CollectionUtil.makeMap(); m_Lists.put( RDF.nil, CollectionUtil. makeList() ); processTypes(); processTriples(); processRestrictions(); return reportLints(); } private RDFLints reportLints() { RDFLints lints = new RDFLints(); lints.add( "Untyped ontologies", toString( m_OWLEntities.getDoubtfulOntologies() ) ); lints.add( "Untyped classes", toString( m_OWLEntities.getDoubtfulClasses() ) ); lints.add( "Untyped datatypes", toString( m_OWLEntities.getDoubtfulDatatypes() ) ); lints.add( "Untyped object properties", toString( m_OWLEntities.getDoubtfulObjectRoles() ) ); lints.add( "Untyped datatype properties", toString( m_OWLEntities.getDoubtfulDatatypeRoles() ) ); lints .add( "Untyped annotation properties", toString( m_OWLEntities .getDoubtfulAnnotaionRoles() ) ); lints.add( "Untyped properties", toString( m_OWLEntities.getDoubtfulRoles() ) ); lints.add( "Untyped individuals", toString( m_OWLEntities.getDoubtfulIndividuals() ) ); lints.add( "Using rdfs:Class instead of owl:Class", toString( m_OWLEntities .getAllRDFClasses() ) ); lints .add( "Multiple typed resources", toString( m_OWLEntities .getMultiTypedResources(excludeValidPunnings) ) ); lints.add( "Literals used where a class is expected", toStringLiterals( m_OWLEntities.getLiteralsAsClass() ) ); lints.add( "Literals used where an individual is expected", toStringLiterals( m_OWLEntities.getLiteralsAsIndividuals() ) ); lints.add( "Resource used where a literal is expected", toString( m_OWLEntities.getResourcesAsLiterals() ) ); lints.addMissingStatements( m_OWLEntities.getAllTypingStatements() ); return lints; } private static List toStringLiterals(Set values) { List strings = CollectionUtil.makeList(); for( Literal value : values ) { strings.add( "\"" + value.toString() + "\"" ); } return strings; } private static List toString(Set values) { List strings = CollectionUtil.makeList(); int bNodeCount = 0; for( RDFNode value : values ) { if( value.isAnon() ) bNodeCount++; else strings.add( value.toString() ); } if( bNodeCount > 0 ) { strings.add( bNodeCount + " BNode(s)" ); } return strings; } private static List toString(Map> map) { List strings = CollectionUtil.makeList(); for( Map.Entry> entry : map.entrySet() ) { StringBuilder builder = new StringBuilder(); builder.append( entry.getKey() ).append( ": " ).append( entry.getValue() ); strings.add( builder.toString() ); } return strings; } private void createList(Resource head, List outList) { if( head.equals( RDF.nil ) ) return; RDFNode first = m_Model.getUniqueObject( head, RDF.first ); RDFNode rest = m_Model.getUniqueObject( head, RDF.rest ); if( first == null ) { // report.addMessage(WARNING, "Invalid List", "The list " + r + " // does not have a rdf:first property"); return; } if( rest == null ) { // report.addMessage(WARNING, "Invalid List", "The list " + r + " // does not have a rdf:rest property"); return; } outList.add( first ); if( !rest.isResource() ) { return; } createList( (Resource) rest, outList ); } private void createList(Resource head) { if( m_Lists.containsKey( head ) ) return; List list = CollectionUtil.makeList(); m_Lists.put( head, list ); createList( head, list ); } private void processTypes() { // list pre-processing for( Statement stmt : m_Model.getStatementsByPredicate( RDF.first ) ) { Resource s = stmt.getSubject(); for( Statement aStmt : m_Model.getStatementsByObject( s ) ) { Property predicate = aStmt.getPredicate(); if( !predicate.equals( RDF.first ) && !predicate.equals( RDF.rest ) ) { createList( s ); break; } } } List processLater = CollectionUtil.makeList(); for( Statement stmt : m_Model.getStatementsByPredicate( RDF.type ) ) { Resource s = stmt.getSubject(); RDFNode o = stmt.getObject(); if( o.equals( OWL.Class ) || o.equals( OWL.DeprecatedClass ) ) m_OWLEntities.addClass( s ); else if( o.equals( RDFS.Class ) ) processLater.add( stmt ); else if( o.equals( RDFS.Datatype ) ) m_OWLEntities.addDatatype( s ); else if( o.equals( OWL.Thing ) ) m_OWLEntities.addIndividual( s ); // else if( o.equals( RDF.List ) ) // Processed in createList() else if( o.equals( OWL.Restriction ) ) m_OWLEntities.addRestriction( s ); else if( o.equals( OWL2.SelfRestriction ) ) m_OWLEntities.addRestriction( s ); else if( o.equals( OWL.AllDifferent ) ) { // Ignore } else if( o.equals( OWL.ObjectProperty ) ) m_OWLEntities.addObjectRole( s ); else if( o.equals( OWL.DatatypeProperty ) ) m_OWLEntities.addDatatypeRole( s ); else if( o.equals( OWL.AnnotationProperty ) ) m_OWLEntities.addAnnotationRole( s ); else if( o.equals( OWL.DeprecatedProperty ) ) m_OWLEntities.addUntypedRole( s ); else if( o.equals( RDF.Property ) ) processLater.add( stmt ); else if( o.equals( OWL.TransitiveProperty ) ) m_OWLEntities.addTransitiveRole( s ); else if( o.equals( OWL.SymmetricProperty ) ) m_OWLEntities.addSymmetricRole( s ); else if( o.equals( OWL2.AsymmetricProperty ) ) m_OWLEntities.addAntiSymmetricRole( s ); else if( o.equals( OWL2.ReflexiveProperty ) ) m_OWLEntities.addReflexiveRole( s ); else if( o.equals( OWL2.IrreflexiveProperty ) ) m_OWLEntities.addIrreflexiveRole( s ); else if( o.equals( OWL.FunctionalProperty ) ) processLater.add( stmt ); else if( o.equals( OWL.InverseFunctionalProperty ) ) m_OWLEntities.addInverseFunctionalRole( s ); else if( o.equals( OWL.Ontology ) ) m_OWLEntities.addOntology( s ); else if( o.equals( OWL.DataRange ) ) m_OWLEntities.addDatatype( s ); else if( o.equals( OWL2.NamedIndividual ) ) m_OWLEntities.addIndividual( s ); else if( o.equals( OWL2.NegativePropertyAssertion ) ) { RDFNode assertedSub = m_Model.getUniqueObject( s, OWL2.sourceIndividual ); RDFNode assertedPred = m_Model.getUniqueObject( s, OWL2.assertionProperty ); RDFNode assertedObjTV = m_Model.getUniqueObject( s, OWL2.targetValue ); RDFNode assertedObjTI = m_Model.getUniqueObject( s, OWL2.targetIndividual ); if( assertedSub != null ) m_OWLEntities.addIndividual( assertedSub ); if( assertedPred != null ) { if (assertedObjTV != null) { m_OWLEntities.assumeDatatypeRole( assertedPred ); } else { m_OWLEntities.assumeObjectRole( assertedPred ); } } if( assertedObjTV != null ) { if( assertedObjTV.isLiteral() ) m_OWLEntities.addLiteral( assertedObjTV ); else m_OWLEntities.addIndividual( assertedObjTV ); } else if( assertedObjTI != null ) { m_OWLEntities.addIndividual( assertedObjTI ); } } else if( o.equals( SWRL.Imp ) ) { // Ignore } else if( o.equals( SWRL.AtomList ) ) { // Ignore } else if( o.equals( SWRL.Variable ) ) { m_OWLEntities.addSWRLVariable( s ); } else if( o.equals( SWRL.ClassAtom ) || o.equals( SWRL.DataRangeAtom ) || o.equals( SWRL.IndividualPropertyAtom ) || o.equals( SWRL.DatavaluedPropertyAtom ) || o.equals( SWRL.SameIndividualAtom ) || o.equals( SWRL.DifferentIndividualsAtom ) ) { processLater.add( stmt ); } else if( o.equals( SWRL.BuiltinAtom ) ) { // Ignore } else { m_OWLEntities.addIndividual( s ); // to check if o is a class processLater.add( stmt ); } } for( Statement stmt : processLater ) { Resource s = stmt.getSubject(); RDFNode o = stmt.getObject(); if( o.equals( RDFS.Class ) ) { if( !m_Model.containsStatement( s, RDF.type, OWL.Restriction ) && !m_Model.containsStatement( s, RDF.type, OWL.Class ) ) m_OWLEntities.addRDFSClass( s ); } else if( o.equals( OWL.FunctionalProperty ) ) { if( !m_OWLEntities.containsRole( s ) ) m_OWLEntities.assumeObjectRole( s ); } else if( o.equals( RDF.Property ) ) { if( !m_OWLEntities.containsRole( s ) ) m_OWLEntities.assumeObjectRole( s ); } else if( o.equals( SWRL.ClassAtom ) ) { RDFNode assertedClass = m_Model.getUniqueObject( s, SWRL.classPredicate ); RDFNode assertedObject = m_Model.getUniqueObject( s, SWRL.argument1 ); m_OWLEntities.assumeClass( assertedClass ); if( !m_OWLEntities.containsIndividual( assertedObject ) ) m_OWLEntities.assumeSWRLVariable( assertedObject ); } else if( o.equals( SWRL.DataRangeAtom ) ) { RDFNode assertedDataRange = m_Model .getUniqueObject( s, SWRL.dataRange ); RDFNode assertedObject = m_Model.getUniqueObject( s, SWRL.argument1 ); m_OWLEntities.assumeDatatype( assertedDataRange ); if( !(assertedObject.isLiteral()) ) m_OWLEntities.assumeSWRLVariable( assertedObject ); } else if( o.equals( SWRL.IndividualPropertyAtom ) ) { RDFNode assertedProperty = m_Model.getUniqueObject( s, SWRL.propertyPredicate ); RDFNode assertedSubject = m_Model.getUniqueObject( s, SWRL.argument1 ); RDFNode assertedObject = m_Model.getUniqueObject( s, SWRL.argument2 ); m_OWLEntities.assumeObjectRole( assertedProperty ); if( !m_OWLEntities.containsIndividual( assertedSubject ) ) m_OWLEntities.assumeSWRLVariable( assertedSubject ); if( !m_OWLEntities.containsIndividual( assertedObject ) ) m_OWLEntities.assumeSWRLVariable( assertedObject ); } else if( o.equals( SWRL.DatavaluedPropertyAtom ) ) { RDFNode assertedProperty = m_Model.getUniqueObject( s, SWRL.propertyPredicate ); RDFNode assertedSubject = m_Model.getUniqueObject( s, SWRL.argument1 ); RDFNode assertedObject = m_Model.getUniqueObject( s, SWRL.argument2 ); m_OWLEntities.assumeDatatypeRole( assertedProperty ); if( !m_OWLEntities.containsIndividual( assertedSubject ) ) m_OWLEntities.assumeSWRLVariable( assertedSubject ); if( !(assertedObject.isLiteral()) ) m_OWLEntities.assumeSWRLVariable( assertedObject ); } else if( o.equals( SWRL.SameIndividualAtom ) || o.equals( SWRL.DifferentIndividualsAtom ) ) { RDFNode assertedObject1 = m_Model.getUniqueObject( s, SWRL.argument1 ); RDFNode assertedObject2 = m_Model.getUniqueObject( s, SWRL.argument2 ); if( !m_OWLEntities.containsIndividual( assertedObject1 ) ) m_OWLEntities.assumeSWRLVariable( assertedObject1 ); if( !m_OWLEntities.containsIndividual( assertedObject2 ) ) m_OWLEntities.assumeSWRLVariable( assertedObject2 ); } else if( o.equals( OWL2.AllDisjointProperties ) || o.equals( OWL2.AllDisjointClasses ) ) { // Ignore, i don't think we want these things flagged. } else m_OWLEntities.assumeClass( o ); } } private void processRestrictions() { for( Resource res : m_OWLEntities.getAllRestrictions() ) { RDFNode prop = m_Model.getUniqueObject( res, OWL.onProperty ); if( prop == null ) continue; RDFNode val = null; val = m_Model.getUniqueObject( res, OWL2.onClass ); if( val != null && val.isResource() ) { m_OWLEntities.assumeObjectRole( prop ); m_OWLEntities.assumeClass( val ); } val = m_Model.getUniqueObject( res, OWL2.onDataRange ); if( val != null && val.isResource() ) { m_OWLEntities.assumeDatatypeRole( prop ); m_OWLEntities.assumeDatatype( val ); } val = m_Model.getUniqueObject( res, OWL.hasValue ); if( val != null ) { if( val.isResource() ) m_OWLEntities.addIndividual( val ); else m_OWLEntities.assumeDatatypeRole( prop ); } if( !m_OWLEntities.containsRole( prop ) ) m_OWLEntities.assumeObjectRole( prop ); val = m_Model.getUniqueObject( res, OWL.someValuesFrom ); if( val == null ) val = m_Model.getUniqueObject( res, OWL.allValuesFrom ); if( val != null && val.isResource() ) { if( m_OWLEntities.containsObjectRole( prop ) ) m_OWLEntities.assumeClass( val ); else if( m_OWLEntities.containsDatatypeRole( prop ) ) m_OWLEntities.assumeDatatype( val ); } } } private void processTriples() { for( Statement stmt : m_Model.getStatements() ) { Resource s = stmt.getSubject(); Property p = stmt.getPredicate(); RDFNode o = stmt.getObject(); if( o.isLiteral() ) m_OWLEntities.addLiteral( o ); if( p.equals( RDF.type ) ) { // these triples have been processed before so don't do anything } else if( p.equals( RDF.subject ) || p.equals( RDF.predicate ) || p.equals( RDF.object ) ) { // processed before } else if( RESTRICTION_PROPS.contains( p ) ) { // Ignore } else if( DATA_RANGE_FACETS.contains( p ) ) { // Ignore } else if( p.equals( OWL2.members ) ) { if( m_Model.containsStatement(s, RDF.type, OWL.AllDifferent) ) { if( m_Lists.containsKey( o ) ) { for( RDFNode r : m_Lists.get( o ) ) { m_OWLEntities.addIndividual( r ); } } else { // TODO we probably want to warn about this case but it is not clear under which category } } else if( m_Model.containsStatement(s, RDF.type, OWL2.AllDisjointClasses) ) { if( m_Lists.containsKey( o ) ) { for( RDFNode r : m_Lists.get( o ) ) { m_OWLEntities.assumeClass( r ); } } else { // TODO we probably want to warn about this case but it is not clear under which category } } else if( m_Model.containsStatement(s, RDF.type, OWL2.AllDisjointProperties) ) { if( m_Lists.containsKey( o ) ) { for( RDFNode r : m_Lists.get( o ) ) { m_OWLEntities.addUntypedRole( r ); } } else { // TODO we probably want to warn about this case but it is not clear under which category } } else { // TODO we probably want to warn about this case but it is not clear under which category } } else if( p.equals( OWL2.assertionProperty ) || p.equals( OWL2.targetValue ) || p.equals( OWL2.sourceIndividual ) || p.equals( OWL2.targetIndividual )) { // processed before } else if( p.equals( OWL.intersectionOf ) || p.equals( OWL.unionOf ) || p.equals( OWL2.disjointUnionOf ) ) { if (o.isResource()) { for( RDFNode node : m_Lists.get( o ) ) m_OWLEntities.assumeClass( node ); } else { // TODO: log this } } else if( p.equals( OWL.complementOf ) ) { if( m_OWLEntities.containsDatatype( s ) ) m_OWLEntities.assumeDatatype( o ); else { m_OWLEntities.assumeClass( s ); m_OWLEntities.assumeClass( o ); } } else if( p.equals( OWL.oneOf ) ) { if( !m_OWLEntities.containsDatatype( s ) ) { m_OWLEntities.assumeClass( s ); if (o.isResource()) { for( RDFNode node : m_Lists.get( o ) ) m_OWLEntities.addIndividual( node ); } else { // TODO: log this } } } else if( p.equals( OWL2.hasKey ) ) { m_OWLEntities.assumeClass(s); if( o.isResource() ) { if( m_Lists.containsKey( o) ) { for( RDFNode aProp : m_Lists.get( o ) ) { m_OWLEntities.addUntypedRole( aProp ); } } else { // what is this case? this is always supposed to be a list, maybe this never happens cause the parser // will catch it. } } } else if( p.equals( RDFS.subClassOf ) ) { m_OWLEntities.assumeClass( s ); m_OWLEntities.assumeClass( o ); } else if( p.equals( OWL.equivalentClass ) ) { // fix for #438: do not assume that both arguments to owl:equivalentClass must automatically be classes // owl:equivalentClass can also be used to relate equivalent datatypes. Make such an assumption only // if both arguments are not datatypes if ( !m_OWLEntities.containsDatatype( s ) && !m_OWLEntities.containsDatatype( o ) ) { m_OWLEntities.assumeClass( s ); m_OWLEntities.assumeClass( o ); } } else if( p.equals( OWL.disjointWith ) ) { m_OWLEntities.assumeClass( s ); m_OWLEntities.assumeClass( o ); } else if( p.equals( OWL.equivalentProperty ) ) { // TODO: i dont think these should be assume object role if( !m_OWLEntities.containsRole( s ) ) m_OWLEntities.assumeObjectRole( s ); if( !m_OWLEntities.containsRole( o ) ) m_OWLEntities.assumeObjectRole( o ); } else if( p.equals( RDFS.subPropertyOf ) ) { // TODO: i dont think these should be assume object role either if( !m_OWLEntities.containsRole( s ) ) m_OWLEntities.assumeObjectRole( s ); if( !m_OWLEntities.containsRole( o ) ) m_OWLEntities.assumeObjectRole( o ); } else if( p.equals( OWL2.propertyDisjointWith ) ) { m_OWLEntities.addUntypedRole( s ); m_OWLEntities.addUntypedRole( o ); } else if( p.equals( OWL2.propertyChainAxiom ) ) { m_OWLEntities.assumeObjectRole( s ); if (o.isResource()) { for( RDFNode node : m_Lists.get( o ) ) m_OWLEntities.assumeObjectRole( node ); } else { // TODO: log this } } else if( p.equals( OWL2.onDatatype ) ) { if( !m_Model.containsStatement(s, RDF.type, RDFS.Datatype)) { m_OWLEntities.assumeDatatype(s); } else { m_OWLEntities.addDatatype(s); } } else if( p.equals( OWL2.withRestrictions ) ) { if( !m_Model.containsStatement(s, RDF.type, RDFS.Datatype)) { m_OWLEntities.assumeDatatype(s); } else { m_OWLEntities.addDatatype(s); } if( o.isResource() && m_Lists.containsKey( o) ) { for( RDFNode aType : m_Lists.get( o ) ) { processWithRestrictionNode(aType); } } else { if (o.isResource()) { // it's a resource, but not a list, maybe then we'll just assume this is a facet and we'll validate it processWithRestrictionNode(o); } else { // TODO: log this? or would this be a parse error. probably not. this is probably a lint? } } } else if( p.equals( OWL.inverseOf ) ) { if( !m_OWLEntities.containsRole( s ) ) { if( s.isAnon() ) m_OWLEntities.addObjectRole( o ); else m_OWLEntities.assumeObjectRole( s ); } if( !m_OWLEntities.containsRole( o ) ) m_OWLEntities.assumeObjectRole( o ); } else if( p.equals( OWL.sameAs ) ) { m_OWLEntities.addIndividual( s ); m_OWLEntities.addIndividual( o ); } else if( p.equals( OWL2.onClass ) ) { m_OWLEntities.assumeClass( o ); } else if( p.equals( OWL.differentFrom ) ) { } else if( p.equals( RDFS.domain ) ) { if( !s.isAnon() ) { if( s.getURI().equals( Namespaces.RDF.toString() ) || s.getURI().equals( Namespaces.OWL.toString() ) ) { // report.addMessage(FULL, "Invalid Domain Restriction", // "rdfs:domain is used on built-in property %1%", st); continue; } } if( !m_OWLEntities.containsRole( s ) ) m_OWLEntities.assumeObjectRole( s ); m_OWLEntities.assumeClass( o ); } else if( p.equals( RDFS.range ) ) { if( s.isAnon() ) { // report.addMessage(FULL, "Invalid Range Restriction", // "rdfs:range is used on an anonymous property"); continue; } if( !s.isAnon() ) { if( s.getURI().equals( Namespaces.RDF.toString() ) || s.getURI().equals( Namespaces.OWL.toString() ) ) { // report.addMessage(FULL, "Invalid Domain Restriction", // "rdfs:domain is used on built-in property %1%", st); continue; } } // we have s rdfs:range o // there are couple of different possibilities // s is DP & o is undefined -> o is Datatype // s is OP & o is undefined -> o is class // s is undefined & o is Class -> s is OP // s is undefined & o is Datatype -> s is DP // s is undefined & o is undefined -> s is OP, o is class // any other case error! if( !m_OWLEntities.containsResource( s ) ) { if( m_OWLEntities.containsDatatype( o ) ) { if( !m_OWLEntities.containsRole( s ) ) { m_OWLEntities.assumeDatatypeRole( s ); } } else if( m_OWLEntities.containsClass( o ) ) { if( !m_OWLEntities.containsRole( s ) ) { m_OWLEntities.assumeObjectRole( s ); } } else if( m_OWLEntities.containsIndividual( o ) || m_OWLEntities.containsRole( o ) ) { // report.addMessage(FULL, "Untyped Resource", "%1% is // used in an rdfs:range restriction", st, ot); } else { if( !m_OWLEntities.containsRole( s ) ) { m_OWLEntities.assumeObjectRole( s ); } m_OWLEntities.assumeClass( o ); } } else if( !m_OWLEntities.containsResource( o ) ) { if( m_OWLEntities.containsObjectRole( s ) ) { m_OWLEntities.assumeClass( o ); } else if( m_OWLEntities.containsDatatypeRole( s ) ) { m_OWLEntities.assumeDatatype( o ); } } } else if( p.equals( OWL2.onDataRange ) ) { m_OWLEntities.assumeDatatype( s ); } else if( p.equals( OWL.distinctMembers ) ) { if (o.isResource()) { for( RDFNode node : m_Lists.get( o ) ) { m_OWLEntities.addIndividual( node ); } } else { // TODO: log this } } else if( p.equals( OWL.imports ) ) { m_OWLEntities.assumeOntology( o ); m_OWLEntities.assumeOntology( s ); } else if( p.equals( RDF.first ) ) { // Ignore } else if( p.equals( RDF.rest ) ) { // Ignore } else if( m_OWLEntities.containsOntologyRole( p ) ) { m_OWLEntities.assumeOntology( o ); m_OWLEntities.assumeOntology( s ); } else if( p.equals( SWRL.Imp ) || p.equals( SWRL.head ) || p.equals( SWRL.body ) || p.equals( SWRL.builtin ) ) { // Ignore } else if( p.equals( SWRL.classPredicate ) || p.equals( SWRL.propertyPredicate ) || p.equals( SWRL.argument1 ) || p.equals( SWRL.argument2 ) || p.equals( SWRL.arguments ) ) { // Processed before } else { if( m_OWLEntities.containsAnnotaionRole( p ) ) { continue; } else if( !m_OWLEntities.containsRole( p ) ) { if( o.isLiteral() ) { m_OWLEntities.assumeDatatypeRole( p ); } else if( !m_OWLEntities.containsIndividual( s ) ) { m_OWLEntities.assumeAnnotationRole( p ); } else { m_OWLEntities.assumeObjectRole( p ); } } if( m_OWLEntities.containsAnnotaionRole( p ) ) { continue; } if( m_OWLEntities.containsDatatypeRole( p ) ) { if (o.isLiteral() ) { Literal literal = o.asLiteral(); String datatypeURI = literal.getDatatypeURI(); if( datatypeURI != null && !datatypeURI.equals( "" ) ) { Resource datatype = ResourceFactory.createResource( datatypeURI ); if( !m_OWLEntities.containsDatatype( datatype ) ) { m_OWLEntities.assumeDatatype( datatype ); } } } else { m_OWLEntities.addResourcesAsLiteral(o.asResource()); } m_OWLEntities.assumeIndividual( s ); } else { m_OWLEntities.assumeIndividual( s ); if( o.isLiteral() ) { m_OWLEntities.addLiteralAsIndividual( o.asLiteral() ); } else { m_OWLEntities.assumeIndividual( o ); } } } } } private void processWithRestrictionNode(RDFNode theNode) { // TODO: implement me // for now, this will do nothing. but the intent here is that theNode is an item from the withRestriction // collection for an owl datatype restriction. so we want this to validate that the facet described is // valid. } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy