SPARQL查询传递性

11

我是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.
2个回答

15

如果您使用的是支持此功能的SPARQL 1.1引擎(您已经标记了您的问题Jena,因此我假设您正在使用其支持此特性的ARQ引擎),则可以使用属性路径。

因此,您可以编写以下类似的查询:

PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT *
WHERE
{
  ?x owl:sameAs+ ?y
}
注意谓词后面的+,它表示应该查找由一个或多个步骤组成的关系。
属性路径的语法可以在这里找到,并且非常类似于正则表达式。使用此类查询的唯一缺点是您无法获取有关路径长度或中间节点的任何信息。

再次感谢您的帮助。我一定会查看有关SPARQL语法的链接。 - Sam
3
如果你所查询的东西支持OWL推理,特别是具有传递性的OWL子集,而你已将该属性定义为“TransitiveProperty”,那么你不需要任何特殊的SPARQL语法,只需正常使用该属性,推理器就会自动处理。 - Michael

5

虽然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. }

同时还返回与:b, :c, :d:e相关的?p?o


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接