2016-06-12 82 views
0

我有以下包含子選擇的SPARQL查詢。該數據包含多個圖形,我想知道的進來什麼圖形爲?b?m中的值:SPARQL子查詢圖名

select ?b, ?m, ?g1 
where { 

{ 
    select ?o1, ?o2, ?e 
    where{ 
     graph ?g{ 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infector_pid> ?o1. 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infectee_pid> ?o2. 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_iteration> '0'^^xsd:decimal. 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_exposureday> ?e. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_pid1> ?o1. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_pid2> ?o2. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_acttype1> '5'^^xsd:decimal. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_acttype2> '5'^^xsd:decimal 
    } 
    }ORDER BY ASC(?e) LIMIT 1 
} 

{ 

graph ?g1 { 
?b <http://ndssl.bi.vt.edu/chicago/vocab/getInfectedBy> ?o1. 
?m <http://ndssl.bi.vt.edu/chicago/vocab/getInfectedBy>* ?b. 
    } 

} 

} 

第二個圖模式包含一個傳遞屬性路徑和查詢提供了遵循正確的結果:

b              m              g1 
----------------------------------------------------- ----------------------------------------------------- ------------------------------------------------------- 
<http://ndssl.bi.vt.edu/chicago/person/pid#446734805> <http://ndssl.bi.vt.edu/chicago/person/pid#446753456> <http://ndssl.bi.vt.edu/chicago/dendrogram/replicate1/> 

但是,我想查看中間節點並計算傳遞關係的路徑長度。如果我從查詢中刪除graph ?g1,則它示出了中間節點信息等下列:

b              m 
--------------------------------------------------- --------------------------------------------------- 
http://ndssl.bi.vt.edu/chicago/person/pid#446718746 http://ndssl.bi.vt.edu/chicago/person/pid#446718746 
http://ndssl.bi.vt.edu/chicago/person/pid#446734805 http://ndssl.bi.vt.edu/chicago/person/pid#446734805 
http://ndssl.bi.vt.edu/chicago/person/pid#446734805 http://ndssl.bi.vt.edu/chicago/person/pid#446753456 

查詢的目的是要弄清楚圖形名稱匹配?b?m。因此,我想使用graph ?g1。是否可以通過保留關鍵字來顯示中間節點?我正在使用Virtuoso。

+0

題外話:這是非法SPARQL語法與','。爲了便於閱讀,我建議使用TURTLE功能使其更加緊湊,特別是對於第一個子選擇。 – AKSW

回答

1

由於您沒有使用g,因此不需要第一個GRAPH聲明。另請注意,第二個GRAPH語句僅使用?o1,因此以下查詢可以執行您想要的操作。您可能還想在您的select子句中檢查SPARQL syntax

PREFIX ndssl: <http://ndssl.bi.vt.edu/chicago/vocab/> 
SELECT ?b ?m ?g1 
WHERE { 
    { 
    SELECT ?o1 
    WHERE { 
     ?s ndssl:dendrogram_infector_pid ?o1    . 
     ?s ndssl:dendrogram_infectee_pid ?o2    . 
     ?s ndssl:dendrogram_iteration  '0'^^xsd:decimal . 
     ?s ndssl:dendrogram_exposureday ?e    . 
     ?s1 ndssl:contactnetwork_pid1  ?o1    . 
     ?s1 ndssl:contactnetwork_pid2  ?o2    . 
     ?s1 ndssl:contactnetwork_acttype1 '5'^^xsd:decimal . 
     ?s1 ndssl:contactnetwork_acttype2 '5'^^xsd:decimal 
    } ORDER BY ASC(?e) LIMIT 1 
    } 
    GRAPH ?g1 { 
    ?b ndssl:getInfectedBy ?o1 . 
    ?m ndssl:getInfectedBy* ?b . 
    } 
} 

在端點提供有不匹配?b?m,不管一個GRAPH聲明是否使用與否。

+0

謝謝你的回答。我需要應用「?e」的最低值,這就是爲什麼我在查詢中使用「ORDER BY ASC(?e)LIMIT 1」的原因。但是,您從答案中忽略了它。如果我使用「ORDER BY」子句,那麼我的問題就與我提到的問題一樣。您可以通過以下SPARQL端點測試我的數據:「http://taos.vbi.vt.edu:8890/sparql」 –

+0

好的,我看到子選擇是關於什麼的,但問題仍然有點模糊。 – scotthenninger

+0

端點提供了匹配?b和?m。我的問題是如果我使用「GRAPH」關鍵字,那麼SPARQL select語句不會提供傳遞性的中間節點。但是,如果我省略「GRAPH」關鍵字,那麼它工作正常。這意味着它提供了中間節點信息。爲什麼這樣?我需要使用「GRAPH」URI的中間節點信息。 –