检索用作类型的空白节点
retrieving a blank node used as a type
我有一个 ontology 类似的东西:
:indi_1 a :Segment; a [ :builds only {:indi_2}]; :hasID 1.
现在我想找到 indi_1
构建的个体。
我做了以下查询:
SELECT distinct ?a
WHERE {:indi_1 a ?b. ?b a _:blankNode}
但我的结果中仍然包含该细分。另外,我无法进入空白节点以检索 indi_2
.
我应该如何构建查询?
我不知道你为什么期望 ?b a :blankNode 要求 ?b 是一个空白节点。 :blankNode 是一个空白节点,在像这样的 SPARQL 查询中充当变量,因此只需要 ?b 有某种类型。您所写的查询甚至不合法。看起来你想要 :indi_1 a ?b . ?b a _:blankNode
(注意 .
,而不是 ;
)。
无论如何,要检查某个节点是否为空白,请查看 SPARQL 1.1 spec, and notice that there's an isBlank 函数。这就是您用来过滤结果的内容。你会有这样的东西:
select * {
?a a ?b
filter isBlank(?b)
}
但如果您真正要查找的是个人列表,则实际上需要更仔细地查看数据的 RDF 序列化。您实际上并不关心 ?b 是否为空,而是它是具有正确属性的限制。来自这样的公理:
:a 仅构建 {:b, :c}
你最终得到这样的 RDF:
:a a owl:NamedIndividual , owl:Thing ;
a [ a owl:Restriction ;
owl:allValuesFrom [ a owl:Class ;
owl:oneOf ( :c :b )
] ;
owl:onProperty :builds
] .
因此您的查询将是:
prefix : <http://www.example.org/>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?x ?y {
?x a [ owl:allValuesFrom [ owl:oneOf/rdf:rest*/rdf:first ?y ] ] .
}
-----------
| x | y |
===========
| :a | :c |
| :a | :b |
-----------
您可以使用更多 属性 路径稍微清理一下:
select ?x ?y {
?x rdf:type/owl:allValuesFrom/owl:oneOf/rdf:rest*/rdf:first ?y .
}
OWL 与 RDF 不同。 SPARQL 是一种 RDF 查询语言。 OWL 可以序列化为 RDF,但序列化并不总是那么漂亮,因此 SPARQL 不一定是查询 OWL 的最佳方式,即使 OWL 可以序列化为RDF。这有点像通过搜索文件中的特定字节或位来搜索文档中的文本。它 可能 有效,但如果有人要更改字符编码,您可能会有相同的 text,但字节或位不同,因此查询可能不再有效了。
我有一个 ontology 类似的东西:
:indi_1 a :Segment; a [ :builds only {:indi_2}]; :hasID 1.
现在我想找到 indi_1
构建的个体。
我做了以下查询:
SELECT distinct ?a
WHERE {:indi_1 a ?b. ?b a _:blankNode}
但我的结果中仍然包含该细分。另外,我无法进入空白节点以检索 indi_2
.
我应该如何构建查询?
我不知道你为什么期望 ?b a :blankNode 要求 ?b 是一个空白节点。 :blankNode 是一个空白节点,在像这样的 SPARQL 查询中充当变量,因此只需要 ?b 有某种类型。您所写的查询甚至不合法。看起来你想要 :indi_1 a ?b . ?b a _:blankNode
(注意 .
,而不是 ;
)。
无论如何,要检查某个节点是否为空白,请查看 SPARQL 1.1 spec, and notice that there's an isBlank 函数。这就是您用来过滤结果的内容。你会有这样的东西:
select * {
?a a ?b
filter isBlank(?b)
}
但如果您真正要查找的是个人列表,则实际上需要更仔细地查看数据的 RDF 序列化。您实际上并不关心 ?b 是否为空,而是它是具有正确属性的限制。来自这样的公理:
:a 仅构建 {:b, :c}
你最终得到这样的 RDF:
:a a owl:NamedIndividual , owl:Thing ;
a [ a owl:Restriction ;
owl:allValuesFrom [ a owl:Class ;
owl:oneOf ( :c :b )
] ;
owl:onProperty :builds
] .
因此您的查询将是:
prefix : <http://www.example.org/>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?x ?y {
?x a [ owl:allValuesFrom [ owl:oneOf/rdf:rest*/rdf:first ?y ] ] .
}
-----------
| x | y |
===========
| :a | :c |
| :a | :b |
-----------
您可以使用更多 属性 路径稍微清理一下:
select ?x ?y {
?x rdf:type/owl:allValuesFrom/owl:oneOf/rdf:rest*/rdf:first ?y .
}
OWL 与 RDF 不同。 SPARQL 是一种 RDF 查询语言。 OWL 可以序列化为 RDF,但序列化并不总是那么漂亮,因此 SPARQL 不一定是查询 OWL 的最佳方式,即使 OWL 可以序列化为RDF。这有点像通过搜索文件中的特定字节或位来搜索文档中的文本。它 可能 有效,但如果有人要更改字符编码,您可能会有相同的 text,但字节或位不同,因此查询可能不再有效了。