Используйте рассуждение библиотеки owlready2 для онтологии, уже находящейся в файле

Я использовал owlready2 (https://owlready2.readthedocs.io/en/latest/)

Я пытаюсь

  1. прочитать онтологию на диске (onto.xml)
  2. добавить правило завихрения
  3. порассуждай над этим
  4. а затем сохраните полученную онтологию с новыми полученными фактами.

Я сейчас немного застрял.

Я пробовал примеры, но не могу понять, почему мне нужно определять классы в программе Python (https://owlready2.readthedocs.io/en/latest/rule.html). Я пробовал это, но у меня уже есть Classes, ObjectProperties и Individuals в моем onto.xml.

«Определение классов, свойств объектов и отдельных лиц в Python работает», — отвечает резонатор.

Я предпочитаю примеры такого рода https://stackoverflow.com/questions/69224096/swrl-rules-in-owl-2/78320189 с братьями и дядями, которым довольно легко следовать.

Пока

Вот Basic_reader.py

#!/usr/bin/env python3
# Owlready2 currently reads the following file format: RDF/XML, OWL/XML, NTriples. The file format is automatically detected.
import argparse
import os

import owlready2 as owl

parser = argparse.ArgumentParser()
parser.add_argument("--ontology", help = "ontology file", required=True)
args = parser.parse_args()

path2in = args.ontology
onto = owl.get_ontology(path2in).load()

print(list(onto.classes()))

print(list(onto.individuals()))

Это работает с онтологией в файле

Если ваша онтология находится в формате ttl, вы можете преобразовать ее на лету следующим образом:

#!/usr/bin/env python3
# Owlready2 currently reads the following file format: RDF/XML, OWL/XML, NTriples. The file format is automatically detected.
import argparse
import os

import owlready2 as owl

parser = argparse.ArgumentParser()
parser.add_argument("--ontology", help = "ontology file as a ttl file", required=True)
args = parser.parse_args()

path2in = args.ontology
path2out = path2in.replace(".ttl", ".xml")

cmd2 = f"ontospy ser -f xml {path2in} 2>/dev/null > {path2out}"
os.system(cmd2)


onto = owl.get_ontology(path2out).load()

print(list(onto.classes()))

print(list(onto.individuals()))

Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Community 14.04.2024 04:07

Поскольку бот запрашивает код: моей целью было бы использовать ответ от @cknoll, но не определять class или individuals в программе Python, имея в onto.owl все, кроме правил. На самом деле даже правила могут быть в файле owl (например, вы можете запустить их и в protégé, с ​​помощью плагина swrl). Программа на Python будет всего лишь аргументом.

di331233 14.04.2024 09:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я отвечаю себе этим рабочим примером:

def main():
    """add a swrl rule."""
    parser = argparse.ArgumentParser()
    parser.add_argument("--ontology", help = "ontology file", required=True)
    parser.add_argument(
        "--destination", help = "destination ontology file", required=True
    )

    args = parser.parse_args()

    input_file = args.ontology
    output_file = args.destination

    onto = owl.get_ontology(input_file).load()

    with onto:
        swrl_rule = """ http://maccve/onto#Machine(?m) ^ http://maccve/onto#Package(?p) ^ http://maccve/onto#CVE(?c) ^ http://maccve/onto#mcontains(?m, ?p) ^ http://maccve/onto#has_CVE(?p, ?c) -> http://maccve/onto#contains_CVE(?m, ?c) """

        rule = owl.Imp()
        rule.set_as_rule(swrl_rule)
        onto.save(file=output_file, format = "rdfxml")

if __name__ == "__main__":
    main()

Итак, давайте попробуем с этой онтологией

@prefix : <http://maccve/onto#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .

:Machine a owl:Class .
:CVE a owl:Class .
:Package a owl:Class .

# Machine contains Package
:mcontains a owl:ObjectProperty ;
         rdfs:domain :Machine ;
         rdfs:range :Package .

# Package has_CVE CVE
:has_CVE a owl:ObjectProperty ;
         rdfs:domain :Package ;
         rdfs:range :CVE .

# Cette property est determinée par swrl
:contains_CVE a owl:ObjectProperty ;
         rdfs:domain :Machine ;
         rdfs:range :CVE .


:www1 a owl:NamedIndividual, :Machine .
:www2 a owl:NamedIndividual, :Machine .

:apache12 a owl:NamedIndividual, :Package .
:apache22 a owl:NamedIndividual, :Package .

:CVE1212 a owl:NamedIndividual, :CVE .

:www1 :mcontains :apache12 .
:www2 :mcontains :apache22 .
:apache22 :has_CVE :CVE1212 .

если правило сработает, оно будет означать, что машина :www2 :m содержит :CVE1212.

Инструмент должен принимать на входе XML-файл, поэтому перед добавлением правила необходимо преобразовать его в XML.

Другие вопросы по теме

Добавьте новых людей в существующую онтологию из фрейма данных, используя owlready 2
Онтологии, построенные только с классами, а не с экземплярами классов
Применение операций CRUD к онтологии из семантического веб-приложения
SPARQL Запрос троек, созданных с использованием онтологического подхода Protégé, для отдельных классов со свойствами объектов
Можете ли вы присвоить значения отдельным лицам на основе экземпляров классов?
Как искать работу с помощью семантического поиска и онтологии с помощью python?
Есть ли способ вывести эквивалентность двух экземпляров на основе нескольких утвержденных DataProperties
Создание и обоснование онтологии Python Owlready2, не удается сохранить ошибку функции при сохранении эквивалента_to
Вопрос о характеристиках недвижимости
Есть ли способ определить значения или состояния для свойств объекта в онтологии?