SPARQL列出所选OWL数据类型的文本

SPARQL列出所选OWL数据类型的文本,sparql,owl,Sparql,Owl,如何在SPARQL中列出仅选定OWL数据类型(此处:VisibilityKind)的所有文本?VisibilityKind的OWL数据类型定义为: DatatypeDefinition( :VisibilityKind DataOneOf( "public"^^xsd:string "private"^^xsd:string "package"^^xsd:string ) ) 要直接回答,您需要在owl:oneOf列表中搜索所有值: SELECT ?resource ?value

如何在SPARQL中列出仅选定OWL数据类型(此处:VisibilityKind)的所有文本?VisibilityKind的OWL数据类型定义为:

DatatypeDefinition( :VisibilityKind 
    DataOneOf( "public"^^xsd:string "private"^^xsd:string "package"^^xsd:string ) 
)

要直接回答,您需要在
owl:oneOf
列表中搜索所有值:

SELECT ?resource ?value
WHERE {
   :VisibilityKind owl:equivalentClass / owl:oneOf / ( rdf:rest*/rdf:first ) ?value .
   ?resource ?prop ?value .
}
但是,有一个警告-其他属性的值可能为“public”、“private”或“package”。要确保仅获取
:VisibilityKind
的值,请将该数据类型定义为使用该数据类型的一系列属性:

{ :someProp rdfs:domain :VisibilityKind }
然后使用以下查询获取范围内定义
:VisibilityKind
的所有属性:

SELECT ?resource ?value
WHERE {
   ?prop rdfs:range :VisibilityKind .
   ?resource ?prop ?value
} 

使用SPARQL,可以获取具有特定数据类型IRI的所有文本。例如,假设您有文本数据,例如
“public”^^:VisibilityKind
,您可以编写:

SELECT ?literal WHERE {
    ?s ?p ?literal .
    FILTER (datatype(?literal) = :VisibilityKind)
}
但这肯定不是您想要的,因为您可能没有具有此数据类型IRI的文本。您可能想要的东西大致可以表述为:

SELECT ?literal WHERE {
    ?s ?p ?literal .
    FILTER (isInDatatype(?literal,:VisibilityKind))
}
其中,
isInDatatype
检查与
?o
关联的值是否属于
:VisibilityKind
的值空间。但是,标准SPARQL 1.1中不存在此类函数。此外,即使它存在,也需要查询引擎理解OWL2的语义并进行推理。因此,您需要一个实现的SPARQL引擎,并且您必须对查询进行一些修改以获得您想要的:

SELECT ?literal WHERE {
    ?s ?p ?literal .
    [] a :VisibilityKind;
       :owl:sameAs ?literal;
    FILTER (isLiteral(?literal))
}

如果您想找到SPARQL 1.1蕴涵机制的实现,可以查看SPARQL工作组收集的数据。

根据,DatatypeDefinition公理表示为
T(DT)owl:equivalentClass T(DR)。
这意味着左侧(DT)将是
:VisibilityKind
和数据范围(DR)实际上,它是由
\ux rdf:type rdfs:Datatype.\uxx owl:T中的一个(SEQ lt1…ltn)。
您确定您的查询将匹配它吗?我想,?o>代码>将是一个空白节点,它通过谓词<代码> OWL具有另一个边缘:一个的值列表。但也许我错了。正如@AKSW所说,建议的查询与之不匹配。不确定是否引用了第一个或第二个查询。我编辑了第一个以包含
owl:equivalentClass
定义。@Annabelle:只是一个问题来澄清您真正想要的:您想要a)数据类型指定的所有值还是b)知识库中属于数据类型(实际上是a的子集)的所有值?我只对b感兴趣(关于数据类型的当前知识)。此外,我知道这是一种枚举(DataOneOf),并且我知道该数据类型已命名(例如:VisibilityKind)。此外,目前我仅限于SPARQL 1.1(我将尝试更新,但由于依赖项列表的原因,我不确定是否可以更新)感谢您提供了详尽的答案。我遇到了一个问题,因为我正在使用SPARQL 1.1(我正在使用Protege工具)。因此,我甚至无法检查您的第二个和第三个查询。在您的查询中?literal是如何定义的?抱歉,我犯了一个错误,我编写了
?o
,而不是
?literal
,但我只是编辑它来更正错误。如果这确实是数据类型,并且不支持推理以及自定义数据类型,那么您可以使用简单的SPARQL qu使用
FILTER(?literal IN(“public”^^xsd:string,“private”^^xsd:string,“package”^^xsd:string))
在Protege中,如果需要推理支持,您必须使用Snap SPARQL插件。