空白节点我有一个本体是这样的:检索用作类型
: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
。
我该如何构建我的查询?
空白节点我有一个本体是这样的:检索用作类型
: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,并注意有一个isBlank功能。这就是你用来过滤你的结果。你有这样的事情:
select * {
?a a ?b
filter isBlank(?b)
}
但如果你实际上追求的是个人的名单,你真正需要的数据的RDF序列更仔细一点。您实际上并不关心?b是空白的,而是它是正确属性的限制。从像一个公理:
:一个建立只{: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,但序列化并不总是那么漂亮,所以即使OWL可以序列化为RDF,SPARQL也不一定是查询OWL的最佳方法。这就像在文档中搜索文本中的文本一样,方法是搜索文件中的特定字节或位。它可能可能工作,但如果有人要改变字符编码,你可以有相同的文本,但不同的字节或位,所以查询可能不再工作。
如果本体符合内存并且不需要CWA,或者使用类似SPARQL DL的东西。 – AKSW
您正在建议的查询正在为我工作。非常感谢!据我所知,对于SPARQL DL,我需要让我的本体论得到推理,这是不可能的,因为它太复杂而无法推理。所以我通过编码以艰难的方式提取信息,这就是为什么我需要这个查询。 – msc87