Как добавить переменное количество значений с помощью swrl

Это мой первый пост о переполнении стека, поэтому я прошу обнадеживающий ответ :) (бонусная репутация)

Я пытаюсь использовать SWRL, чтобы сделать некоторые вычисления для меня. Чтобы сымитировать проблему, я создал небольшую онтологию, используя протеже 4.3. Он имеет только два класса Parent и Son. Экземпляры включают 1 родителя (Джон) и трех сыновей (сын1, сын2, сын3). Джон связан с тремя сыновьями с помощью свойства объекта hasSon. Возраст каждого сына указывается с помощью свойства типа данных "hasAge" (целые числа).

Вопрос-1: мне нужно сначала проверить, сколько экземпляров связано с данным родителем (Джоном), используя свойство hasSon. Как этого можно добиться в 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 -->

person MujahidMohsin    schedule 22.08.2015    source источник
comment
Просто небольшой вопрос для уточнения: абсолютно ли важно выполнять эти задачи с помощью SWRL? Или вы можете использовать онтологическую структуру, такую ​​как OWL API или Apache Jena?   -  person Kunal Khaladkar    schedule 27.08.2015


Ответы (1)


Ответ 1: Через SWRL невозможно проверить, сколько экземпляров подключено к определенному свойству через SWRL. Для этого лучше написать sparql-запрос с COUNT. В качестве альтернативы вы можете использовать структуру онтологии и использовать Iterator, чтобы выяснить количество.

Ответ 2: Невозможно зациклить правило SWRL, выполнить операцию и вернуть значение. Правила SWRL предназначены для добавления дополнительной информации об отношениях и не действуют как язык программирования.

Решение. Гораздо лучше использовать онтологическую структуру, такую ​​как Apache Jena или Owl API, и написать программу для обработки этого, а не полагаться на SWRL. SWRL поддерживает только монотонные выводы и поэтому не может использоваться для циклического перебора данных в онтологии. Попытка сделать это приведет к бесконечному выполнению правила.
Вместо этого напишите для этого небольшой код. См. owl API или API онтологии Jena и sparql чтобы узнать больше о том, как использовать эти технологии.

person Kunal Khaladkar    schedule 27.08.2015