gpt4 book ai didi

path - 具有任意属性的SPARQL属性路径查询

转载 作者:行者123 更新时间:2023-12-04 00:44:14 25 4
gpt4 key购买 nike

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

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


其中 ?p*指定路径。有办法吗?

最佳答案

没错,您不能在属性路径表达式中使用变量。但是,您可以做一些可能对您有所帮助的事情。

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

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

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


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

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


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

<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对这些结果进行排序并将该查询包装在另一个查询中,则可以对 group_concat使用 ?p来按顺序获取属性的单个字符串。 (不能保证保留顺序,但这是很常见的行为。有关此技术如何工作的另一个示例,请参见我对 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>" |
-----------------------------------------

关于path - 具有任意属性的SPARQL属性路径查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26698675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com