Вам не нужно создавать правило для выражения вашей онтологии, вы можете сделать это полностью в OWL. Сначала мы определим онтологию на основе вашего примера, но с некоторыми новыми аксиомами. В частности, мы определяем два новых выражения класса: InfluentialArticle
и ImportantArticle
. Влиятельная статья имеет высокое или среднее влияние, важный автор написал по крайней мере одну влиятельную статью:
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix owl: <http://www.w3.org/2002/07/owl#>.
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix cs: <http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#>.
# properties
cs:hasAuthor
a owl:ObjectProperty ;
rdfs:domain cs:Article ;
rdfs:range cs:Author .
cs:wrote
a owl:ObjectPropert ;
owl:inverseOf cs:hasAuthor .
# classes
cs:hasInfluenceFactor
a owl:ObjectProperty ;
rdfs:domain cs:Article ;
rdfs:range cs:InfluenceFactor .
cs:InfluenceFactor
owl:equivalentClass
[a owl:Class ;
owl:oneOf ( cs:high cs:medium cs:low )
].
cs:Author a owl:Class.
cs:Article a owl:Class.
# axioms
# an influential article has a high or medium impact
cs:InfluentialArticle
rdfs:subClassOf cs:Article ;
owl:equivalentClass [
owl:unionOf (
[a owl:Restriction ;
owl:onProperty cs:hasInfluenceFactor ;
owl:hasValue cs:high]
[a owl:Restriction ;
owl:onProperty cs:hasInfluenceFactor ;
owl:hasValue cs:medium
]
)
].
# an important author wrote an influential article
cs:ImportantAuthor
rdfs:subClassOf cs:Author ;
owl:equivalentClass [
a owl:Restriction ;
owl:onProperty cs:wrote ;
owl:someValuesFrom cs:InfluentialArticle
].
# individuals
# fred wrote a lousy paper
cs:fred
a cs:Author.
cs:article1
a cs:Article ;
cs:hasInfluenceFactor cs:low ;
cs:hasAuthor cs:fred.
# jane wrote a good paper
cs:jane
a cs:Author.
cs:article2
a cs:Article ;
cs:hasInfluenceFactor cs:high ;
cs:hasAuthor cs:jane.
Теперь мы можем написать некоторый код Jena, чтобы загрузить эту онтологию и обработать ее с помощью встроенного механизма рассуждений:
package examples;
import java.util.Iterator;
import com.hp.hpl.jena.ontology.*;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.util.FileManager;
public class ReasonerExample
{
String NS = "http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#";
public static void main( String[] args ) {
new ReasonerExample().run();
}
public void run() {
OntModel m = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM_MICRO_RULE_INF );
FileManager.get().readModel( m, "src/main/resources/comp-sci.ttl" );
// list all authors
System.out.println( "All authors:" );
OntClass author = m.getOntClass( NS + "Author" );
for (Iterator<? extends OntResource> i = author.listInstances(); i.hasNext(); ) {
System.out.println( " " + i.next().getURI() );
}
// list high impact authors
OntClass importantAuthor = m.getOntClass( NS + "ImportantAuthor" );
System.out.println( "Important authors:" );
for (Iterator<? extends OntResource> i = importantAuthor.listInstances(); i.hasNext(); ) {
System.out.println( " " + i.next().getURI() );
}
}
}
Что дает следующий результат:
All authors:
http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#jane
http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#fred
Important authors:
http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#jane
Примечание. Я также исправил ваши имена, чтобы использовать соглашения OWL: первая заглавная буква для классов, строчная буква для всего остального. Я также упростил ограничения домена и диапазона, которые были немного странными.
Обновить
Следуя комментарию автора, я перевел онтологию в RDF/XML с помощью инструмента Jena rdfcat
следующим образом:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cs="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<owl:Class rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#Article"/>
<owl:Class rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#Author"/>
<owl:ObjectProperty rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#hasAuthor">
<rdfs:domain rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#Article"/>
<rdfs:range rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#Author"/>
</owl:ObjectProperty>
<owl:ObjectProperty rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#hasInfluenceFactor">
<rdfs:domain rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#Article"/>
<rdfs:range>
<rdf:Description rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#InfluenceFactor">
<owl:equivalentClass>
<owl:Class>
<owl:oneOf rdf:parseType="Collection">
<rdf:Description rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#high"/>
<rdf:Description rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#medium"/>
<rdf:Description rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#low"/>
</owl:oneOf>
</owl:Class>
</owl:equivalentClass>
</rdf:Description>
</rdfs:range>
</owl:ObjectProperty>
<rdf:Description rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#ImportantAuthor">
<rdfs:subClassOf rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#Author"/>
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty>
<owl:ObjectPropert rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#wrote">
<owl:inverseOf rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#hasAuthor"/>
</owl:ObjectPropert>
</owl:onProperty>
<owl:someValuesFrom>
<rdf:Description rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#InfluentialArticle">
<rdfs:subClassOf rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#Article"/>
<owl:equivalentClass rdf:parseType="Resource">
<owl:unionOf rdf:parseType="Collection">
<owl:Restriction>
<owl:onProperty rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#hasInfluenceFactor"/>
<owl:hasValue rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#high"/>
</owl:Restriction>
<owl:Restriction>
<owl:onProperty rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#hasInfluenceFactor"/>
<owl:hasValue rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#medium"/>
</owl:Restriction>
</owl:unionOf>
</owl:equivalentClass>
</rdf:Description>
</owl:someValuesFrom>
</owl:Restriction>
</owl:equivalentClass>
</rdf:Description>
<cs:Article rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#article2">
<cs:hasInfluenceFactor rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#high"/>
<cs:hasAuthor>
<cs:Author rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#jane"/>
</cs:hasAuthor>
</cs:Article>
<cs:Article rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#article1">
<cs:hasInfluenceFactor rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#low"/>
<cs:hasAuthor>
<cs:Author rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#fred"/>
</cs:hasAuthor>
</cs:Article>
</rdf:RDF>
person
Ian Dickinson
schedule
30.04.2013