Ответ 1
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
.
Последняя из этих работ лучше всего подходит для большого числа моделей и большой модели, но немного более сложна для настройки.