2016-05-14 30 views
0

我正在運行具有任意長度屬性路徑的SPARQL 1.1查詢。 我可以在Sesame Sail Repository中非常高效地運行這些查詢。但是,他們運行速度非常緩慢,在Jena使用Dataset(由Graph創建)或Model(TDB)。Jena中適用於任意長度屬性路徑的倉庫

除了TDB或Graph之外,Jena還有其他可能嗎?

示例: 對於60 MB N3 RDF文件,具有約600,000三倍和以下查詢:

SELECT ?x ?y { 
?x <http://relationship.com/wasRevisionOf>+ ?y . 
?x <http://relationship.com/wasGeneratedBy>/<http://relationship.com/wasAssociatedWith> ?z1 . 
    ?y <http://relationship.com/wasGeneratedBy>/<http://relationship.com/wasAssociatedWith> ?z2 . 
    FILTER(?z1 = ?z2 && ?x=<http://article.com/524910968> && ?y=<http://article.com/524753791>) 
} LIMIT 3 

隨着耶拿TDB花費14秒來執行該查詢,JENA格拉夫約38秒,並在芝麻賽歐庫內存中存儲只需要100-150毫秒。*

  • 這100-150毫秒適用於從1MB每個文件大小設置爲200 MB,所需的三元組包括在所有的文件。
+1

請注意,從結束的原因**「尋求調試幫助(」爲什麼不是這個代碼工作?「)的問題必須包括所需的行爲,特定的問題或錯誤以及在問題本身,沒有明確問題陳述的問題對其他讀者沒有用,請參閱:如何創建一個最小,完整和可驗證的示例。「**您能否提供一個示例,其中Jena中的屬性路徑非常緩慢,帆? –

+1

你問:除了Model和Graph之外,Jena還有其他的可能嗎?但我認爲這不是一個正確的問題,因爲這些只是具有不同實現的接口。內存中的模型或圖表可能會很慢,但如果您有大量數據,則應該將數據存儲爲TDB數據集,該數據集具有索引,並且可能效率更高。 –

+0

謝謝,我認爲這已經是答案。我會在TDB上做實驗,然後讓你知道。 –

回答

1

雖然我建議您嘗試使用TDB以利用基於磁盤的索引,但我會指出可以幫助任何SPARQL引擎做得更好的一些事情。在你的查詢中,你有一個篩選器有一些相當簡單的條件。一個可能的問題是,從概念上講,過濾器說可以得到可能的結果,然後修剪它們。現在,對於簡單的條件,優化器可能會識別篩選器,這些篩選器可以在查詢期間應用以防止過度工作。

在這種情況下,當您只需使用一個變量而不是兩個時,您就會要求?z1 =?z2。您還可以設置一些過濾器,只需設置?x?y的指定值時,您可以簡單地使用該值或塊。希望這不會使任何區別,但沿着這些路線考慮某些重寫:

select ?x ?y { 
    values (?x ?y) { (<...> <...>) } 
    ?z ^(:wasGeneratedBy/:wasAssociatedWith) ?x, ?y . 
    ?x :wasRevisionOf+ ?y . 
} 
limit 3 

另一件事,也許會有幫助,一般(但你的情況不一定),是搜索,因爲措辭,可能會天真地執行,從一個?z值開始,找到?x和?y的值,然後檢查?x和?y之間是否存在合適的路徑。但是由於?x和?y可以按任意順序匹配,並且修訂路徑可能只朝一個方向發展,因此在子查詢中首先查找合適的?x?y對,然後在子查詢中查找?z值外部查詢。這可能對你而言並不重要,因爲你從一開始就修復了?x和?y的值。

+0

非常感謝。這是一個改進(約50%),但仍然與芝麻的MemoryStore(帆倉庫)不相上下。 (大約10秒比100-150ms)。 –

+0

我在Jena中使用內存中圖表再次運行此優化查詢,所有文件大小大約需要300-400 ms。謝謝。 –