【问题标题】:SPARQL property path queries with arbitrary properties具有任意属性的 SPARQL 属性路径查询
【发布时间】:2014-11-02 11:15:16
【问题描述】:

SPARQL property path 任意长度的查询需要使用特定的属性。我想查询并找到从一个资源开始并以另一个资源结束的任何路径。例如:

SELECT ?p
WHERE { :startNode ?p* :endNode }

其中?p* 指定路径。有没有办法做到这一点?

【问题讨论】:

  • 我有点怀疑 SPARQL 是否可行(?p 会绑定到什么?构成具体属性路径的 SPARQL 字符串?),您可能想看看 RelFinder 是什么人们确实(或多或少)找出了两种资源之间的任意联系。
  • 您可以通过(<>|!<>)* 之类的操作来使用通配符,这可以让您找出是否从一个地方到另一个地方的路径,但您不能使用属性路径中的变量。

标签: path rdf sparql semantic-web


【解决方案1】:

您是对的,您不能在属性路径表达式中使用变量。不过,您可以做几件事,可能会对您有所帮助。

用于检查是否路径存在的通配符

您可以通过将通配符和它的取反来使用通配符,因此您可以执行一个简单的查询来检查是否存在连接两个资源的路径:

<source> (<>|!<>)* <target>

如果您定义了 : 前缀,则可以更短,因为 : 是有效的 IRI:

<source> (:|!:)* <target>

如果两个节点之间有一条路径(或多条路径),您可以使用由?p 连接的通配符路径将其拆分,从而找到路径上的所有?ps:

<source> (:|!:)* ?x .
?x ?p ?y .
?y (:|!:)* <target> .

我认为,您可以通过使用空白节点而不是 ?x?y 来缩短它:

<source> (:|!:)* [ ?p [ (:|!:)* <target> ] ]

(不过,可能不起作用。我似乎记得语法实际上不允许空白节点内某些地方的属性路径。我不确定。)

对于单个路径,获取属性和位置,然后group_concat

现在,如果两个资源之间只有一条路径,您甚至可以沿该路径获取属性及其位置。您可以按这些位置排序,然后使用 group by 将属性按顺序连接成单个字符串。这可能是最容易看到的一个例子。假设您有以下数据,其中包含从 :a:d 的单一路径:

@prefix : <urn:ex:> .

:a :p1 :b .
:b :p2 :c .
:c :p3 :d .

然后您可以使用这样的查询来获取路径中的每个属性及其位置。 (不过,这仅在只有一条路径时才有效。请参阅我对Is it possible to get the position of an element in an RDF Collection in SPARQL? 的回答,了解更多关于其工作原理的信息。)

prefix : <urn:ex:>

select ?p (count(?mid) as ?pos) where {
  :a (:|!:)* ?mid .
  ?mid (:|!:)* ?x .
  ?x ?p ?y. 
  ?y (:|!:)* :d
}
group by ?x ?p ?y
-------------
| p   | pos |
=============
| :p2 | 2   |
| :p1 | 1   |
| :p3 | 3   |
-------------

现在,如果您按 ?pos 对这些结果进行排序并将 that 查询包装在另一个查询中,那么您可以在 ?p 上使用 group_concat 按顺序获取单个属性字符串。 (不能保证保留的顺序,但这是很常见的行为。有关此技术如何工作的另一个示例,请参阅我对 obtain the matrix in protege 的回答,以及有关为什么不能保证的讨论,请参阅 my answer to Ordering in GROUP_CONCAT in SPARQL 1.1。)

prefix : <urn:ex:>

select (group_concat(concat('<',str(?p),'>');separator=' ') as ?path) {
  select ?p (count(?mid) as ?pos) where {
    :a (:|!:)* ?mid .
    ?mid (:|!:)* ?x .
    ?x ?p ?y. 
    ?y (:|!:)* :d
  }
  group by ?x ?p ?y
  order by ?pos
}
-----------------------------------------
| path                                  |
=========================================
| "<urn:ex:p1> <urn:ex:p2> <urn:ex:p3>" |
-----------------------------------------

【讨论】:

  • 为什么还要为空的 URI &lt;&gt; 烦恼?是否有任何 Triplestore/SPARQL 引擎组合实际上允许这样做? Fuseki 将空 URI 替换为当前图的本地 URL。看来您可以省略空 URI 并选择 (!&lt;&gt;)*
  • @Blakeregalia 是的,它不太可能引起问题,但有时人们会以奇怪的方式使用 uris。使用替代得到一切,使用否定得到除了一个之外的一切。如果您确定没有使用,那么简单的否定就可以了。
猜你喜欢
  • 2021-04-06
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 2017-05-29
  • 1970-01-01
相关资源
最近更新 更多