Я использовал owlready2 (https://owlready2.readthedocs.io/en/latest/)
Я пытаюсь
onto.xml)Я сейчас немного застрял.
Я пробовал примеры, но не могу понять, почему мне нужно определять классы в программе 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()))
Поскольку бот запрашивает код: моей целью было бы использовать ответ от @cknoll, но не определять class или individuals в программе Python, имея в onto.owl все, кроме правил. На самом деле даже правила могут быть в файле owl (например, вы можете запустить их и в protégé, с помощью плагина swrl). Программа на Python будет всего лишь аргументом.






Я отвечаю себе этим рабочим примером:
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.
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.