2014-11-02 141 views
9

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

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

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

+0

我有点怀疑,可能与SPARQL(会是什么'?p'绑定到构成具体属性路径的SPARQL字符串?),并且您可能需要查看[RelFinder](http://www.visualdataweb.org/relfinder.php)人员所做的事情(更多或更少)两个资源之间的任意连接。 – 2014-11-02 11:27:51

+1

你可以通过类似'(<> |!<>)*'的方式来使用通配符,这将允许你找出*是否有从一个地方到另一个地方的路径,但是你不能在属性路径中使用变量。 – 2014-11-02 13:53:01

回答

12

你说得对,你不能在属性路径表达式中使用变量。有几件事你可以做,但是,这可能会帮助你。

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

您可以通过采取它和它的否定的脱节使用通配符,所以你可以做一个检查是否有连接路径的简单查询两种资源:

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

如果你有:前缀定义,甚至可能更短,因为:是一个有效的IRI:

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

如果两个节点之间的路径(或多个路径),你可以使用?p加入通配符路径拆分它,所以找到所有的?p S中的路径上:

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

你可以说,甚至更短,我认为,通过使用空白节点,而不是?x?y

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

(即可能不行,你GH。我似乎回想起实际上在空白节点内的某些地方禁止使用属性路径的语法。我不知道。)

对于单一路径,得到的属性和位置,然后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>" | 
----------------------------------------- 
+0

为什么要打扰空URI'<>'?任何triplestore/SPARQL引擎组合实际上是否允许这样做? Fuseki用本地URL替换空的URI到当前图。看来你可以忽略空的URI,只是选择'(!<>)*' – 2015-12-10 00:47:49

+0

@Blakeregalia是的,它不太可能会导致问题,但有时候人们会以奇怪的方式使用uris。使用替代可以获得一切,使用否定可以获得除一个以外的所有内容。如果你确定没有使用过,那么简单的否定就没有问题。 – 2015-12-10 01:33:54