首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Jena的rdf推理规则

通过Jena的rdf推理规则
EN

Stack Overflow用户
提问于 2013-04-28 22:50:37
回答 1查看 596关注 0票数 1

我想表达这样的关系:如果文章X有作者Y,并且作者有influenceFactor中或高(3个等级:低,中,高),那么这篇文章就被认为是强烈推荐的。

代码语言:javascript
复制
(?x computer-science#hasAuthor ?y)(?y computer-science#hasInfluenceFactor computer-science#High) -> (?x computer-science#isImportant computer-science#importantfactor)

我的想法对吗?

以下是本体的一些片段

代码语言:javascript
复制
<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>

真诚地感谢任何关注我问题的人:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-30 19:14:36

你不需要创建一个规则来表达你的本体,你可以完全用OWL来完成。首先,我们基于您的示例定义一个本体,但是使用了一些新的公理。特别地,我们定义了两个新的类表达式:InfluentialArticleImportantArticle。一篇有影响力的文章有高或中的影响力,一个重要的作者至少写了一篇有影响力的文章:

代码语言:javascript
复制
@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代码来加载这个本体,并使用内置的推理器对其进行处理:

代码语言:javascript
复制
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() );
        }
    }
}

这将提供以下输出:

代码语言:javascript
复制
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约定:类以大写字母开头,其他字母以小写字母开头。我还简化了域和范围约束,这有点奇怪。

更新

根据原始帖子中的评论,我使用Jena的rdfcat工具将本体转换为RDF/XML,如下所示:

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16264087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档