Jena的被分成API,應用程序開發人員和SPI對系統開發人員,如人制作存儲引擎,推理等等
DataSet
,Model
,Statement
,Resource
和Literal
是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
你不這樣做(據我記得)。更有趣的情況是Resource
與Node
。 Resources
知道他們屬於哪個模型,所以你可以(在api中)寫resource.addProperty(...)
,最終成爲Graph#add
。 Node
沒有這樣的便利,並且與特定的Graph
沒有關聯。因此Resource#asNode
是有損的。
最後:
當我想抱着三元的個體串,但查詢它們作爲一個大束(工會),我應該使用這些數據結構的(爲什麼)?
你很明顯是一個普通的用戶,所以你想要的API。你想存儲三元組,所以使用Model
。現在你想查詢模型作爲一個聯盟:你可以:
Model#union()
所有,它會將所有的三元組複製到一個新的模型。
ModelFactory.createUnion()
一切,這將創建一個動態聯盟(即不復制)。
- 將模型作爲命名模型存儲在TDB或SDB數據集存儲中,並使用
unionDefaultGraph
選項。
最後這些工程最適合大量模型和大型模型,但是需要更多的參與設置。
澄清了很多,我似乎也忽略了ModelFactory .createUnion()到目前爲止,謝謝:) – Droggl
關於這個區別更多一點:http://willware.blogspot.com/2010/02/jena-node-versus-rdfnode.html –
另外值得注意的是,Triple也不是Node(或Quad)是實際的接口,而是類。 – Ruben