在文件中已有的本体上使用 owlready2 库的推理器

问题描述 投票:0回答:1

我用过

owlready2
https://owlready2.readthedocs.io/en/latest/

我正在努力

  1. 读取磁盘上的本体 (
    onto.xml
    )
  2. 添加 swrl 规则
  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()))
python ontology swrl owlready
1个回答
0
投票

我用这个工作示例回复自己:

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

© www.soinside.com 2019 - 2024. All rights reserved.