0

这是我第一篇关于堆栈溢出的帖子,所以我请求一个令人鼓舞的回复:)(奖励声誉)

我正在尝试使用 SWRL 为我做一些计算。为了模仿这个问题,我使用 protege 4.3 创建了一个小型本体。它只有两个类 Parent 和 Son。实例包括 1 个父 (John) 和三个儿子 (son1、son2、son3)。约翰使用“hasSon”对象属性与 3 个儿子相关联。使用“hasAge”数据类型属性(整数)提及每个儿子的年龄。

问题 1:我需要首先使用 hasSon 属性检查有多少实例与给定的 Parent(John) 链接。这如何在 SWRL 中实现?

问题 2:在知道儿子的数量之后,我必须将他们的年龄相加才能再次使用 SWRL 获得所有儿子的总年龄?

对我来说,这需要一个类似加法(a=a+b)的循环,但我不知道这将如何在 SWRL 中工作。我已为您附上了 OWL 代码。(请注意,在实际的本体中,链接的实例不是 3 个而是变化的,计算它们是问题的一部分)提前致谢

 <?xml version="1.0"?>


<!DOCTYPE rdf:RDF [
    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
    <!ENTITY parenttrial "http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#" >
]>


<rdf:RDF xmlns="http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#"
     xml:base="http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:parenttrial="http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <owl:Ontology rdf:about="http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial"/>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Object Properties
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#hasSon -->

    <owl:ObjectProperty rdf:about="&parenttrial;hasSon">
        <rdfs:domain rdf:resource="&parenttrial;Parent"/>
        <rdfs:range rdf:resource="&parenttrial;Son"/>
    </owl:ObjectProperty>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Data properties
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#hasAge -->

    <owl:DatatypeProperty rdf:about="&parenttrial;hasAge"/>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Classes
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#Parent -->

    <owl:Class rdf:about="&parenttrial;Parent"/>



    <!-- http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#Son -->

    <owl:Class rdf:about="&parenttrial;Son"/>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Individuals
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#JohnF -->

    <owl:NamedIndividual rdf:about="&parenttrial;JohnF">
        <rdf:type rdf:resource="&parenttrial;Parent"/>
        <hasSon rdf:resource="&parenttrial;Son1"/>
        <hasSon rdf:resource="&parenttrial;Son2"/>
        <hasSon rdf:resource="&parenttrial;Son3"/>
    </owl:NamedIndividual>



    <!-- http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#Son1 -->

    <owl:NamedIndividual rdf:about="&parenttrial;Son1">
        <rdf:type rdf:resource="&parenttrial;Son"/>
        <hasAge rdf:datatype="&xsd;integer">3</hasAge>
    </owl:NamedIndividual>



    <!-- http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#Son2 -->

    <owl:NamedIndividual rdf:about="&parenttrial;Son2">
        <rdf:type rdf:resource="&parenttrial;Son"/>
        <hasAge rdf:datatype="&xsd;integer">4</hasAge>
    </owl:NamedIndividual>



    <!-- http://www.semanticweb.org/admin/ontologies/2015/7/parenttrial#Son3 -->

    <owl:NamedIndividual rdf:about="&parenttrial;Son3">
        <rdf:type rdf:resource="&parenttrial;Son"/>
        <hasAge rdf:datatype="&xsd;integer">5</hasAge>
    </owl:NamedIndividual>
</rdf:RDF>



<!-- Generated by the OWL API (version 3.4.2) http://owlapi.sourceforge.net -->
4

1 回答 1

1

答案 1:无法通过 SWRL 检查有多少实例通过 SWRL 连接到某个属性。你最好为此编写一个 sparql 查询COUNT。或者,您可以使用本体框架并使用 anIterator来计算计数。

答案 2:没有办法循环 SWRL 规则,执行操作并返回值。SWRL 规则旨在添加有关关系的额外信息,而不是用作编程语言。

解决方案:最好使用 Apache Jena 或 Owl api 等本体框架并编写程序来处理此问题,而不是依赖 SWRL。SWRL 仅支持单调推理,因此不能用于循环本体中的数据。尝试这样做会导致规则无限执行。
而是编写一些代码来执行此操作。请参阅owl apiJena ontology apisparql以了解有关如何使用这些技术的更多信息。

于 2015-08-27T10:01:13.957 回答