我正在尝试使用基数限制进行查询。查询看起来像
ClassA 和(roleA min 2 ClassB)
但这会返回一个空集。另一方面,当我进行查询时
ClassA 和(roleA some ClassB)
它返回了一些ClassA的个体。当我知道某些ClassA个人肯定至少有两个角色时,为什么基数查询不起作用?
更具体地说,我有 Team , Player 和 Position 这两个类,对象属性使用 (与团队和玩家相关)和 hasPosition (关联玩家和职位 >)。我正在尝试进行查询
团队和使用 min 2(播放器和 hasPosition 部分 { Striker **} **)
应该返回有两个或更多Strikers的团队但显然因为OWL没有做出唯一名称假设它返回一个空集。我试图声明我的一些人是不同的,但当我执行查询与不同的个人到位时,它会导致Protégé崩溃。在没有明确个体的情况下运行查询时,Protégé不会崩溃。
编辑:
Protege中来自Pellet的错误消息 在Ontology XML中显示的前锋
答案 0 :(得分:1)
在这个问题中还没有足够的信息来确定你为什么没有得到你正在寻找的结果,但我们可以很好地重现这个场景,以证明这是可以实现的。考虑一个包含三个类和一些个体的本体:
和公理
然后查询
返回个人team1。 (这也适用于“hasPosition some {Striker}”,但对于一个值,我认为值关键字更适合。)
这是本体论:
@prefix : <http://stackoverflow.com/q/22688901/1281433/competitions#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://stackoverflow.com/q/22688901/1281433/competitions>
a owl:Ontology .
:Player a owl:Class .
:Position a owl:Class .
:Team a owl:Class .
:hasPosition a owl:ObjectProperty .
:Striker a owl:NamedIndividual , :Position .
:p1 a owl:NamedIndividual , :Player ;
:hasPosition :Striker .
:p2 a owl:NamedIndividual , :Player ;
:hasPosition :Striker .
[ a owl:AllDifferent ;
owl:distinctMembers ( :p1 :p2 )
] .
:team1 a owl:NamedIndividual , :Team ;
:employs :p1 , :p2 .