无法使用公理推断实例

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 中的样子:

推理器启动后,它会正确推断出 aGoal:

的一个实例

这是实际的 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