2011-08-08 205 views
23

我開始與Jena引擎一起工作,我想我掌握了什麼語義。 但是我有一個很難理解的不同方式來表示一串在耶拿和ARQ三元:Jena/ARQ:模型,圖形和數據集之間的區別

  • 開始時在你跌倒的第一件事是Model和文檔說,對RDF圖的名字傑納斯。
  • 但是也有Graph這似乎是必要的工具時,我想查詢的型號工會,但它似乎並沒有與Model共用一個接口,雖然可以得到GraphModel
  • 然後在ARQ中有DataSet,這似乎也是某種三元組的集合。

當然,環顧一些在API中,我找到了一些方法從一個轉換到另一個。不過,我懷疑除了3個不同的接口外,還有更多相同的東西。

所以,問題是:這三者之間的關鍵設計差異是什麼?我應該什麼時候使用哪一個?特別是:當我想要保存單個三元組,但將它們查詢爲一個大集合(聯合)時,我應該使用哪些數據結構(以及爲什麼)? 另外,當我從一個「轉換」到另一個時(例如model.getGraph()包含的信息少於model),我是否會「鬆動」任何東西?

回答

18

Jena的被分成API,應用程序開發人員和SPI對系統開發人員,如人制作存儲引擎,推理等等

DataSetModelStatementResourceLiteral是API接口,並提供許多應用程序開發人員的便利。

DataSetGraph,Graph,Triple,Node是SPI接口。他們非常簡陋並且易於實現(正如你希望如果你必須實現這些東西)。

各種各樣的API操作都可以解析爲SPI調用。舉一個例子,Model interface有四種不同的方法contains。內部每個結果在一個電話:

Graph#contains(Node, Node, Node) 

graph.contains(nodeS, nodeP, nodeO); // model.contains(s, p, o) or model.contains(statement) 
graph.contains(nodeS, nodeP, Node.ANY); // model.contains(s, p) 

關於你失去的信息,與Model和問題Graph你不這樣做(據我記得)。更有趣的情況是ResourceNodeResources知道他們屬於哪個模型,所以你可以(在api中)寫resource.addProperty(...),最終成爲Graph#addNode沒有這樣的便利,並且與特定的Graph沒有關聯。因此Resource#asNode是有損的。

最後:

當我想抱着三元的個體串,但查詢它們作爲一個大束(工會),我應該使用這些數據結構的(爲什麼)?

你很明顯是一個普通的用戶,所以你想要的API。你想存儲三元組,所以使用Model。現在你想查詢模型作爲一個聯盟:你可以:

  • Model#union()所有,它會將所有的三元組複製到一個新的模型。
  • ModelFactory.createUnion()一切,這將創建一個動態聯盟(即不復制)。
  • 將模型作爲命名模型存儲在TDB或SDB數據集存儲中,並使用unionDefaultGraph選項。

最後這些工程最適合大量模型和大型模型,但是需要更多的參與設置。

+0

澄清了很多,我似乎也忽略了ModelFactory .createUnion()到目前爲止,謝謝:) – Droggl

+1

關於這個區別更多一點:http://willware.blogspot.com/2010/02/jena-node-versus-rdfnode.html –

+0

另外值得注意的是,Triple也不是Node(或Quad)是實際的接口,而是類。 – Ruben

12

簡短回答:Model只是一個無狀態的包裝,有很多方便的方法圍繞GraphModelFactory.createModelForGraph(Graph)在模型中包裝圖形。 Model.getGraph()獲取包裝圖。

大多數應用程序員會使用Model。我個人更喜歡使用Graph,因爲它更簡單。我無法記住Model課程中的所有練習。

Dataset是幾個Model s的集合:一個「默認模型」和零個或多個「命名模型」。這對應於SPARQL中「RDF數據集」的概念。 (從技術上講,SPARQL不是「RDF圖」的查詢語言,而是「RDF數據集」,它可以是指定的RDF圖的集合加上默認圖。)

相關問題