2014-11-02 100 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