10

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

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

:a owl:sameas :b.
:b owl:sameas :c.
4

2 回答 2

14

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

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

PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT *
WHERE
{
  ?x owl:sameAs+ ?y
}

注意+谓词后面的,用于指示它应该寻找由一个/多个步骤组成的关系。

可以在此处找到属性路径的语法,并且非常类似于正则表达式。使用它的查询的唯一缺点是您无法获得有关路径有多长或中间节点是什么的任何信息。

于 2011-12-20T06:51:00.750 回答
4

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

让我们以此扩展您的示例:

:a owl:sameAs :d.
:e owl:sameAs :d.

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

也可能有特定于实现的扩展来处理owl:sameAs推理,例如在Virtuoso中:

DEFINE input:same-as "yes"
select * where { :a ?p ?o. }

还返回?pand?o:b, :c, :dand发布:e

于 2012-05-29T12:27:01.390 回答