Rdf SPARQL查询传递

Rdf SPARQL查询传递,rdf,sparql,jena,owl,inference,Rdf,Sparql,Jena,Owl,Inference,我是SPARQL的初学者,想知道是否有一个查询可以帮助我返回传递关系。例如,下面的n3文件,我希望查询返回“a是相同的c”或类似的内容。谢谢 @prefix : <http://websitename.com/links/> . @prefix owl: <http://www.w3.org/2002/07/owl#> . :a owl:sameas :b. :b owl:sameas :c. @前缀:。 @前缀owl:。 :猫头鹰:同样的。 :猫头鹰:同样的。 如果

我是SPARQL的初学者,想知道是否有一个查询可以帮助我返回传递关系。例如,下面的n3文件,我希望查询返回“a是相同的c”或类似的内容。谢谢

@prefix : <http://websitename.com/links/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .

:a owl:sameas :b.
:b owl:sameas :c.
@前缀:。
@前缀owl:。
:猫头鹰:同样的。
:猫头鹰:同样的。

如果您使用的是适当启用的SPARQL 1.1引擎,您可以使用属性路径,您已经标记了问题Jena,因此我假设您使用的是支持此功能的ARQ引擎

因此,您可以编写如下查询:

PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT *
WHERE
{
  ?x owl:sameAs+ ?y
}
前缀owl:
挑选*
哪里
{
?x猫头鹰:sameAs+?y
}
注意谓词后面的
+
,用于指示它应该查找由一个或多个步骤组成的关系

可以找到属性路径的语法,它非常类似于正则表达式。使用这种方法进行查询的唯一缺点是,您无法获得有关路径长度或中间节点的任何信息。

虽然在您的情况下是正确的,但我认为owl:sameAs的双向性质值得一提

让我们通过以下方式扩展您的示例:

:a owl:sameAs :d.
:e owl:sameAs :d.
在这种情况下,一个简单的
owl:sameAs+
不足以找到
:e
,因此可以使用类似
(owl:sameAs | ^owl:sameAs)+
的方法来找到整个等价树。请注意,根据端点的不同,这可能会导致循环

此外,还可能有特定于实现的扩展来处理
owl:sameAs
推理,例如:


还将返回为
:b、:c、:d
:e
发布的
:p
?o
,再次感谢您的帮助。如果你查询的东西支持OWL推理,特别是一个包含可传递性的OWL配置文件,并且你已经将属性定义为可传递属性,那么你不需要任何特殊的SPARQL语法,你可以正常使用该属性,推理者会做正确的事。
DEFINE input:same-as "yes"
select * where { :a ?p ?o. }