2015-08-22 2 views
0

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

Я пытаюсь использовать SWRL сделать некоторые расчеты для меня. Чтобы подражать проблеме, я создал небольшую онтологию с использованием протеже 4.3. У этого есть только два класса Родитель и Сын. Экземпляры включают 1 родителя (Иоанна) и трех сыновей (son1, son2, son3). Джон связан с тремя сыновьями, используя свойство объекта hasSon. Эпоха каждого сына упоминается с использованием свойства типа «hasAge» (целые числа).

Вопрос-1: Мне нужно сначала проверить, сколько экземпляров связано с данным родителем (John) с использованием свойства 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 --> 
+0

Просто быстрый вопрос для уточнения, абсолютно ли важно выполнять эти задачи с помощью SWRL? Или вы можете использовать систему онтологии, такую ​​как OWL API или Apache Jena? –

ответ

0

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

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

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