2017-05-04 34 views
0

我擁有如下所示的RDF三元組集合。在SPARQL中查找星形子圖模式

id#7289587 ex:getInfectedBy id#7748320 
id#7694711 ex:getInfectedBy id#7748320 
id#7748322 ex:getInfectedBy id#7748320 
id#7748887 ex:getInfectedBy id#7748320 

id#7746679 ex:getInfectedBy id#7748510 
id#6434108 ex:getInfectedBy id#7748510 
id#7458397 ex:getInfectedBy id#7748510 

我的目標是計算各種節點長度(4,5,6,...,20)的星形子圖形。例如,我寫下面的查詢來查找節點長度爲4的星形子圖模式(?s1?s2?s3?o)。

SELECT ?o count(distinct ?o) 
WHERE 
{ 
    ?s1 ?p ?o. 
    ?s2 ?p ?o. 
    ?s3 ?p ?o.FILTER((?s1!=?s2) && (?s1!=?s3) && (?s2!=?s3)) 
} group by ?o 

節點4的上述查詢計數星形圖案長度爲兩個節點id#7748320id#7748510。但是,它假設給我只有節點id#7748510的結果。如果我使用5節點星型模式修改查詢,那麼節點id#7748320也會顯示在那裏。你能幫我解決嗎?

是否有可能用一個查詢計算各種節點長度(4,5,6,...,20)的星形子圖形?請告訴我。我感謝您的幫助。

+0

只需使用'SELECT * WHERE'用你的查詢來看看爲什麼這在SPARQL中是正確的。很明顯,節點id#7748320'的數據也與SPARQL查詢的模式相匹配,它只是要求在查詢中滿足「至少」該要求的內容。 – AKSW

回答

1

除了我的評論,我只想用一個不同的,更高效的查詢其「罪狀每個節點的所有傳入的節點」,然後使用HAVING其過濾:

SELECT ?o (COUNT(DISTINCT ?s) AS ?cnt) 
WHERE 
    { ?s ?p ?node } 
GROUP BY ?o 
HAVING (?cnt = 3) # three incoming nodes 
+0

非常感謝您的回覆。我認爲你的意思是「節點」不是「?o」。我已經運行了您在virtuoso SPARQL端點上提供的查詢。它給了我以下錯誤:'Virtuoso 37000錯誤SP031:SPARQL編譯器:變量?cnt用於聚合之外的結果集中,而在GROUP BY子句中未提及。請回復我。 –

+1

如果我修改'HAVING'子句,如下所示:'HAVING(COUNT(DISTINCT?s)= 3)'。非常感謝您的幫助。 –

+0

對,我忘了Virtuoso有一個問題,在某些情況下,聚合的結果仍然在範圍內,但無論如何都會報告錯誤。 – AKSW