无法使用公理推断实例
Unable to infer instances using axioms
我想通过ontology匹配和推理来收集数据。为此,我想首先确定相关个体,如果他们满足特定条件(使用一般 class 公理),供以后使用。
然而,目前我无法使用 Protégé 实现必要的推论。由不同个体组成的数据是这样的:
# Data
# Common Prefixes omitted for readability
@prefix ns: <http://example.org/underlyingSchema#> .
@prefix data: <http://example.org/data#> .
data:A1 a ns:A .
data:A2 a ns:A .
data:R1 a ns:R .
ns:defines data:A1 ;
ns:definedBy data:P1 .
data:R2 a ns:R .
ns:defines data:A2 ;
ns:definedBy data:P2 .
data:P1 a ns:P ;
ns:hasS data:S1.
data:P2 a ns:P ;
ns:hasS data:S2.
data:S1 a ns:S ;
ns:hasI data:I1 ;
ns:hasV data:B1 .
data:S2 a ns:S ;
ns:hasI data:I1 ;
ns:hasV data:B2 .
data:I1 a ns:I ;
expr:hasString "relevant" .
data:B1 a ns:B ;
expr:hasBoolean "true"^^xsd:boolean .
data:B2 a ns:B ;
expr:hasBoolean "false"^^xsd:boolean .
我想推断相关属性为真的 A 的每个实例也是我的示例的实例-class,在我自己的 ontology 中定义为 eg:Example a owl:class
.
不幸的是,由于数据的底层模式非常繁琐,我必须通过 A -> R -> P -> S -> I and B
来完成。然而,由于 R 不是一个简单的定义(A <- R -> P -> S -> I and B
可能是更准确的表示),我不能只做一个 someValuesFrom 链并且(我假设)这是我失败的地方。
使用 Protégé,我加载了定义属性和 classes(命名空间 ns)的架构,以便能够在 class 表达式编辑器中使用 suggestions/auto-complete。在我自己的ontology(仅包含示例-class)中,按照我尝试使用公理的先前建议:
A and (inverse defines some) and definedBy some (hasS some (hasI some(hasString value "relevant")) and (hasV some(hasBoolean value "true"^^xsd:boolean))) EquivalentTo: Example
然后我将我的 ontology 与数据和 运行 推理器合并,希望看到 A1(但不是 A2)作为我的示例的实例 - class,但没有'得到任何结果。我还尝试仅使用 "true"
和 true
以及 "relevant"^^xsd:string
来查看数据类型是否导致了问题,但仅推断 Example 是 A 的子 class .
我相信我对 inverse
所做的事情的理解是不正确的(我认为它被使用是因为 A1 是三元组 R1 defines A1
中的对象;所以我也尝试了 inverse defines self
),但我无法理解出去。非常感谢任何帮助。
Edit:
正如 Joshua 正确指出的那样,我的示例缺少声明。就我而言,这些是在不同的模式 ontology 中制作的,所以我在这里忘记了它们。为了完整起见将添加:
# Might as well include prefixes
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix expr: <http://purl.org/voc/express#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
# Classes
ns:A a owl:Class .
ns:R a owl:Class .
ns:P a owl:Class .
ns:S a owl:Class .
ns:I a owl:Class .
ns:B a owl:Class .
# Object Properties
ns:defines a owl:ObjectProperty .
ns:definedBy a owl:ObjectProperty .
ns:hasS a owl:ObjectProperty .
ns:hasI a owl:ObjectProperty .
ns:hasV a owl:ObjectProperty .
# Data Properties
expr:hasString a owlDatatypeProperty .
expr:hasBoolean a owlDatatypeProperty .
数据似乎不是 Protege 生成的。当我复制该内容并将其加载到 Protege 中时,所有内容都显示为注释属性,通常不会在 OWL 推理下处理。它们显示为注释属性,因为没有 属性 声明使它们成为对象属性或数据类型属性。这可能是你问题的一部分。那个公理看起来也不太正确。例如,(inverse defines some) 没有意义;那必须是(逆定义)一些class表达式,等等。一般来说,如果你能提供,它会有很大帮助我们可以使用的完整工作示例。请参阅如何创建 Minimal, Complete, and Verifiable example。
综上所述,我认为我们可以重现足够多的问题来弄清楚如何解决它。听起来您想识别像
这样的模式
A <--rdf:type-- ?a <--p-- ?b --q--> ?c --r--> 42
然后推断三元组
?a --rdf:type--> Goal
这在 OWL 中是可以实现的。它需要以下形式的公理:
A and ((inverse p) some (q some (r value 42))) SubClassOf 目标
也就是说,如果某个东西是 A 并且是某个东西的 p 值,它的 q 值为 r 值为 42,那么第一个东西也是一个目标。
这是它在实际 ontology 中的样子:
推理器启动后,它会正确推断出 a 是 Goal:
的一个实例
这是实际的 ontology:
@prefix : <http://example.org/gca#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://example.org/gca> .
<http://example.org/gca> rdf:type owl:Ontology .
#################################################################
# Object Properties
#################################################################
### http://example.org/gca#p
:p rdf:type owl:ObjectProperty .
### http://example.org/gca#q
:q rdf:type owl:ObjectProperty .
#################################################################
# Data properties
#################################################################
### http://example.org/gca#r
:r rdf:type owl:DatatypeProperty .
#################################################################
# Classes
#################################################################
### http://example.org/gca#A
:A rdf:type owl:Class .
### http://example.org/gca#Goal
:Goal rdf:type owl:Class .
#################################################################
# Individuals
#################################################################
### http://example.org/gca#a
:a rdf:type owl:NamedIndividual ,
:A .
### http://example.org/gca#b
:b rdf:type owl:NamedIndividual ;
:p :a ;
:q :c .
### http://example.org/gca#c
:c rdf:type owl:NamedIndividual ;
:r 42 .
#################################################################
# General axioms
#################################################################
[ owl:intersectionOf ( :A
[ rdf:type owl:Restriction ;
owl:onProperty [ owl:inverseOf :p
] ;
owl:someValuesFrom [ rdf:type owl:Restriction ;
owl:onProperty :q ;
owl:someValuesFrom [ rdf:type owl:Restriction ;
owl:onProperty :r ;
owl:hasValue 42
]
]
]
) ;
rdf:type owl:Class ;
rdfs:subClassOf :Goal
] .
### Generated by the OWL API (version 4.2.5.20160517-0735) https://github.com/owlcs/owlapi
我想通过ontology匹配和推理来收集数据。为此,我想首先确定相关个体,如果他们满足特定条件(使用一般 class 公理),供以后使用。
然而,目前我无法使用 Protégé 实现必要的推论。由不同个体组成的数据是这样的:
# Data
# Common Prefixes omitted for readability
@prefix ns: <http://example.org/underlyingSchema#> .
@prefix data: <http://example.org/data#> .
data:A1 a ns:A .
data:A2 a ns:A .
data:R1 a ns:R .
ns:defines data:A1 ;
ns:definedBy data:P1 .
data:R2 a ns:R .
ns:defines data:A2 ;
ns:definedBy data:P2 .
data:P1 a ns:P ;
ns:hasS data:S1.
data:P2 a ns:P ;
ns:hasS data:S2.
data:S1 a ns:S ;
ns:hasI data:I1 ;
ns:hasV data:B1 .
data:S2 a ns:S ;
ns:hasI data:I1 ;
ns:hasV data:B2 .
data:I1 a ns:I ;
expr:hasString "relevant" .
data:B1 a ns:B ;
expr:hasBoolean "true"^^xsd:boolean .
data:B2 a ns:B ;
expr:hasBoolean "false"^^xsd:boolean .
我想推断相关属性为真的 A 的每个实例也是我的示例的实例-class,在我自己的 ontology 中定义为 eg:Example a owl:class
.
不幸的是,由于数据的底层模式非常繁琐,我必须通过 A -> R -> P -> S -> I and B
来完成。然而,由于 R 不是一个简单的定义(A <- R -> P -> S -> I and B
可能是更准确的表示),我不能只做一个 someValuesFrom 链并且(我假设)这是我失败的地方。
使用 Protégé,我加载了定义属性和 classes(命名空间 ns)的架构,以便能够在 class 表达式编辑器中使用 suggestions/auto-complete。在我自己的ontology(仅包含示例-class)中,按照我尝试使用公理的先前建议:
A and (inverse defines some) and definedBy some (hasS some (hasI some(hasString value "relevant")) and (hasV some(hasBoolean value "true"^^xsd:boolean))) EquivalentTo: Example
然后我将我的 ontology 与数据和 运行 推理器合并,希望看到 A1(但不是 A2)作为我的示例的实例 - class,但没有'得到任何结果。我还尝试仅使用 "true"
和 true
以及 "relevant"^^xsd:string
来查看数据类型是否导致了问题,但仅推断 Example 是 A 的子 class .
我相信我对 inverse
所做的事情的理解是不正确的(我认为它被使用是因为 A1 是三元组 R1 defines A1
中的对象;所以我也尝试了 inverse defines self
),但我无法理解出去。非常感谢任何帮助。
Edit:
正如 Joshua 正确指出的那样,我的示例缺少声明。就我而言,这些是在不同的模式 ontology 中制作的,所以我在这里忘记了它们。为了完整起见将添加:
# Might as well include prefixes
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix expr: <http://purl.org/voc/express#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
# Classes
ns:A a owl:Class .
ns:R a owl:Class .
ns:P a owl:Class .
ns:S a owl:Class .
ns:I a owl:Class .
ns:B a owl:Class .
# Object Properties
ns:defines a owl:ObjectProperty .
ns:definedBy a owl:ObjectProperty .
ns:hasS a owl:ObjectProperty .
ns:hasI a owl:ObjectProperty .
ns:hasV a owl:ObjectProperty .
# Data Properties
expr:hasString a owlDatatypeProperty .
expr:hasBoolean a owlDatatypeProperty .
数据似乎不是 Protege 生成的。当我复制该内容并将其加载到 Protege 中时,所有内容都显示为注释属性,通常不会在 OWL 推理下处理。它们显示为注释属性,因为没有 属性 声明使它们成为对象属性或数据类型属性。这可能是你问题的一部分。那个公理看起来也不太正确。例如,(inverse defines some) 没有意义;那必须是(逆定义)一些class表达式,等等。一般来说,如果你能提供,它会有很大帮助我们可以使用的完整工作示例。请参阅如何创建 Minimal, Complete, and Verifiable example。
综上所述,我认为我们可以重现足够多的问题来弄清楚如何解决它。听起来您想识别像
这样的模式A <--rdf:type-- ?a <--p-- ?b --q--> ?c --r--> 42
然后推断三元组
?a --rdf:type--> Goal
这在 OWL 中是可以实现的。它需要以下形式的公理:
A and ((inverse p) some (q some (r value 42))) SubClassOf 目标
也就是说,如果某个东西是 A 并且是某个东西的 p 值,它的 q 值为 r 值为 42,那么第一个东西也是一个目标。
这是它在实际 ontology 中的样子:
推理器启动后,它会正确推断出 a 是 Goal:
的一个实例这是实际的 ontology:
@prefix : <http://example.org/gca#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://example.org/gca> .
<http://example.org/gca> rdf:type owl:Ontology .
#################################################################
# Object Properties
#################################################################
### http://example.org/gca#p
:p rdf:type owl:ObjectProperty .
### http://example.org/gca#q
:q rdf:type owl:ObjectProperty .
#################################################################
# Data properties
#################################################################
### http://example.org/gca#r
:r rdf:type owl:DatatypeProperty .
#################################################################
# Classes
#################################################################
### http://example.org/gca#A
:A rdf:type owl:Class .
### http://example.org/gca#Goal
:Goal rdf:type owl:Class .
#################################################################
# Individuals
#################################################################
### http://example.org/gca#a
:a rdf:type owl:NamedIndividual ,
:A .
### http://example.org/gca#b
:b rdf:type owl:NamedIndividual ;
:p :a ;
:q :c .
### http://example.org/gca#c
:c rdf:type owl:NamedIndividual ;
:r 42 .
#################################################################
# General axioms
#################################################################
[ owl:intersectionOf ( :A
[ rdf:type owl:Restriction ;
owl:onProperty [ owl:inverseOf :p
] ;
owl:someValuesFrom [ rdf:type owl:Restriction ;
owl:onProperty :q ;
owl:someValuesFrom [ rdf:type owl:Restriction ;
owl:onProperty :r ;
owl:hasValue 42
]
]
]
) ;
rdf:type owl:Class ;
rdfs:subClassOf :Goal
] .
### Generated by the OWL API (version 4.2.5.20160517-0735) https://github.com/owlcs/owlapi