java - gena - Jena/ARQ: Diferencia entre modelo, gráfico y conjunto de datos
jena batalla (2)
Jena se divide en una API, para desarrolladores de aplicaciones, y un SPI para desarrolladores de sistemas, como personas que hacen motores de almacenamiento, razonadores, etc.
DataSet
, Model
, Statement
, Resource
y Literal
son interfaces API y ofrecen muchas comodidades para los desarrolladores de aplicaciones.
DataSetGraph
, Graph
, Triple
, Node
son interfaces SPI. Son bastante sencillos y fáciles de implementar (como esperarías si tuvieras que implementar las cosas).
La gran variedad de operaciones de API se resuelven en llamadas SPI. Para dar un ejemplo, la interfaz del Model
tiene cuatro métodos diferentes que contains
. Internamente cada uno de los resultados en una llamada:
Graph#contains(Node, Node, Node)
como
graph.contains(nodeS, nodeP, nodeO); // model.contains(s, p, o) or model.contains(statement)
graph.contains(nodeS, nodeP, Node.ANY); // model.contains(s, p)
Con respecto a su pregunta sobre la pérdida de información, con Model
and Graph
no lo hace (por lo que recuerdo). El caso más interesante es el Resource
frente al Node
. Resources
saben a qué modelo pertenecen, por lo que puede (en la api) escribir resource.addProperty(...)
que se convierte eventualmente en un Graph#add
. Node
no tiene dicha conveniencia y no está asociado con un Graph
particular. Por lo tanto, el Resource#asNode
tiene pérdidas.
Finalmente:
Cuando quiero mantener grupos individuales de triples pero consultarlos como un gran grupo (unión), ¿cuál de estas estructuras de datos debo usar (y por qué)?
Claramente eres un usuario normal, así que quieres la API. Quieres almacenar triples, así que usa el Model
. Ahora desea consultar los modelos como una unión: podría:
-
Model#union()
todo, que copiará todos los triples en un nuevo modelo. -
ModelFactory.createUnion()
todo, lo que creará una unión dinámica (es decir, sin copia). - Almacene sus modelos como modelos con nombre en un almacén de datos TDB o SDB, y use la opción
unionDefaultGraph
.
El último de estos funciona mejor para un gran número de modelos, y un modelo grande, pero es un poco más complicado de configurar.
Estoy empezando a trabajar con el motor Jena y creo que comprendí lo que es la semántica. Sin embargo, me cuesta entender las diferentes formas de representar un montón de triples en Jena y ARQ:
- La primera cosa con la que se topa al iniciar es
Model
y la documentación dice su nombre Jenas para los gráficos RDF. - Sin embargo, también hay un
Graph
que parece ser la herramienta necesaria cuando quiero consultar una unión de modelos, sin embargo, no parece compartir una interfaz común con elModel
, aunque se puede obtener elGraph
de unModel
- Luego está el
DataSet
en ARQ, que también parece ser una colección de triples de algún tipo.
Claro, después de mirar alrededor en la API, encontré maneras de convertir de una manera a otra. Sin embargo, sospecho que hay más de 3 interfaces diferentes para la misma cosa.
Entonces, la pregunta es: ¿Cuáles son las diferencias de diseño clave entre estos tres? ¿Cuándo debo usar cuál? Especialmente: cuando quiero mantener grupos individuales de triples pero consultarlos como un gran grupo (unión), ¿cuál de estas estructuras de datos debo usar (y por qué)? Además, ¿"pierdo" algo al "convertir" de uno a otro (por ejemplo, model.getGraph()
contiene menos información de alguna manera que el model
)?
Respuesta corta: el Model
es solo una envoltura sin estado con muchos métodos de conveniencia alrededor de un Graph
. ModelFactory.createModelForGraph(Graph)
ajusta un gráfico en un modelo. Model.getGraph()
obtiene el gráfico envuelto.
La mayoría de los programadores de aplicaciones usarían el Model
. Personalmente prefiero usar Graph
porque es más simple. Tengo problemas para recordar todos los cruceros en la clase Model
.
Dataset
es una colección de varios Model
: un "modelo predeterminado" y cero o más "modelos con nombre". Esto corresponde a la noción de un "conjunto de datos RDF" en SPARQL. (Técnicamente hablando, SPARQL no es un lenguaje de consulta para "gráficos RDF" sino para "conjuntos de datos RDF" que pueden ser colecciones de gráficos RDF nombrados más un gráfico predeterminado).