2016-02-10 33 views
0

我有這樣的數據SPARQL如何子查詢到另一個查詢

@prefix : <http://test.example/> . 

:alice :likes :beethoven. 
:alice :likes :verdi. 
:sofia :likes :beethoven. 
:sofia :likes :verdi. 
:sofia :likes :rossini. 
:ania :likes :verdi. 
:ania :likes :beethoven. 
:ania :likes :david. 
:david :likes :ania. 
:david :likes :beethoven. 
:david :likes :verdi. 
:antonino :likes :verdi. 
:antonino :likes :mozart. 
:weirdo :likes :katyperry. 
:beethoven a :recommendable. 
:verdi a :recommendable. 
:rossini a :recommendable. 
:katyperry a :recommendable. 
:mozart a :recommendable. 

和我做一個查詢來獲取,喜歡同樣的項目作爲特定用戶

select ?anotherUser (COUNT(?anotherItem) as ?countOfItems) WHERE { 
    values ?user {:ania} 
    ?anotherUser :likes ?anotherItem. 
    filter (?anotherUser != ?user) 
    filter exists {?user :likes ?anotherItem} 
}group by ?anotherUser 
order by desc(?countOfItems) 

現在我想用戶以獲得這些用戶喜歡的項目(但當然沒有他們與該特定用戶共享的項目(:ania))

我知道我必須在其他人中包含查詢,我試過了我自己卻沒有成功,你能幫忙嗎?

+1

你可以顯示你已經嘗試過,爲什麼它沒有按預期工作? –

回答

5

現在我想要得到的項目,這些用戶喜歡(當然沒有的項目,它們與特定的用戶共享(作者:阿尼亞))

我知道我必須包括內部查詢其他,我自己嘗試了很多,但沒有成功,你能幫忙嗎?

我相信最重要的是要記住子查詢是最重要的,即查詢是從最裏面的第一個到最外面的。

所以下面的查詢:

prefix : <http://test.example> 
select distinct ?user ?anotherUser ?item WHERE { 
    ?anotherUser :likes ?item. 
    filter not exists {?user :likes ?item} 
    {select ?user ?anotherUser where { 
    values ?user {:ania} 
    ?anotherUser :likes ?anotherItem. 
    filter (?anotherUser != ?user) 
    filter exists {?user :likes ?anotherItem} 
    }} 
} 

會產生的結果:

---------------------------------- 
| user | anotherUser | item  | 
================================== 
| :ania | :sofia  | :rossini | 
| :ania | :antonino | :mozart | 
| :ania | :david  | :ania | 
---------------------------------- 

這是你問什麼吧?

+0

這不是我正在尋找的。 'anotherUser'是否在你的內部和外部查詢中引用同一個變量? –

+0

是的,它的確如此。相同的變量 – chris