правила рассуждения rdf через Jena

Я хочу выразить это отношение: если у статьи X есть автор Y, а у автора фактор влияния средний или высокий (3 класса: низкий, средний, высокий), то эта статья считается настоятельно рекомендуемой.

(?x computer-science#hasAuthor ?y)(?y computer-science#hasInfluenceFactor computer-science#High) -> (?x computer-science#isImportant computer-science#importantfactor)

моя мысль правильная?

вот фрагмент онтологии

<owl:ObjectProperty rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#hasAuthor">
    <rdf:type rdf:resource="&owl;TransitiveProperty"/>
    <owl:propertyDisjointWith rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#isAuthorOf"/>
    <rdfs:range>
        <owl:Restriction>
            <owl:onProperty rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#hasAuthor"/>
            <owl:someValuesFrom rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#author"/>
        </owl:Restriction>
    </rdfs:range>
    <rdfs:domain>
        <owl:Restriction>
            <owl:onProperty rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#hasAuthor"/>
            <owl:someValuesFrom rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#article"/>
        </owl:Restriction>
    </rdfs:domain>
</owl:ObjectProperty>
   <owl:ObjectProperty rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#hasInfluenceFactor">
    <rdf:type rdf:resource="&owl;TransitiveProperty"/>
    <rdfs:domain rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#author"/>
    <rdfs:range rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#influenceFator"/>
</owl:ObjectProperty>
<owl:NamedIndividual rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#High">
    <rdf:type rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#influenceFator"/>
</owl:NamedIndividual>
<owl:ObjectProperty rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#isImportant">
    <rdf:type rdf:resource="&owl;TransitiveProperty"/>
    <rdfs:range rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#importantFactor"/>
    <rdfs:domain rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#influenceFator"/>
</owl:ObjectProperty>
  <owl:NamedIndividual rdf:about="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#importantFactor">
    <rdf:type rdf:resource="http://www.semanticweb.org/aero/ontologies/2013/1/computer-science#importantFactor"/>
</owl:NamedIndividual>

искреннее спасибо любому зрителю моего вопроса :)


person Sarotti    schedule 28.04.2013    source источник


Ответы (1)


Вам не нужно создавать правило для выражения вашей онтологии, вы можете сделать это полностью в 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
comment
привет, Ян @ Ян Дикинсон, спасибо за такое подробное знакомство. Я думаю, что понял, что вы сказали, но... Я знаю, что это действительно очень глупо, где я могу интегрировать эти аксиомы в свой файл онтологии в формате RDF/XML? Я использовал протеже 4.2 для создания онтологии предметной области. Не могли бы вы дать мне дополнительную информацию, чтобы завершить это? Спасибо - person Sarotti; 30.04.2013
comment
Что ж, Protégé должен уметь читать формат Turtle, а также RDF/XML. Однако я перевел для вас онтологию в RDF/XML, используя rdfcat Йены. См. обновленную версию ответа для RDF/XML. - person Ian Dickinson; 30.04.2013
comment
Чисто. Большое спасибо, Ян, ты сделал мне большую услугу :) - person Sarotti; 01.05.2013