有没有办法将Hibernate Session作为RDF三元组读取?

时间:2009-07-27 14:59:16

标签: hibernate rdf sparql jena data-integration

我需要根据标准来查询我的本地Hibernate托管数据存储区中的持久对象,其中WHERE子句的相关数据位于链接开放数据云中。

有没有办法将Hibernate Session作为RDF读取?如果是这样,我至少可以使用组合的数据集来决定从Hibernate中检索哪些对象。

优选地,解决方案会将Hibernate Session暴露在Jena内部,因为我熟悉它。另外,我需要支持RDFS推理和SPARQL检索。

2 个答案:

答案 0 :(得分:1)

由于您将使用Jena(和ARQ)来执行SPARQL查询,因此您可以使用自定义FileManager来解析Hibernate对象/图形(假设您希望每个对象都由图形表示)。

Jena有short HOWTO使用FileManager来定位模型,而ARQ RDF dataset tutorial(请参阅“描述数据集”部分)可能会提供一些有关如何执行更多操作的提示将图URI(以及这些图的内容作为RDF数据集)的自定义映射到现有的Hibernate管理数据。

另一个选项可能是创建一个映射到现有Hibernate架构的自定义SDB layout。我不知道SDB在这方面有多灵活。

答案 1 :(得分:0)

以下是我发布问题后发现的内容:

没有专门针对Hibernate Session进行三重化的现有工具。要自己实现,我需要使用Graph作为基础或StageGenerator来实现GraphBase。因此,问题的答案是“没有一个”,所以我继续考虑如何实施它。

我需要决定是否对会话中已有的对象进行三重化(即已经被某些早期查询访问过),依赖于访问数据库或两者兼而有之。如果要进入数据库,我还需要决定是否加载整个对象,然后将其附加到会话或使用投影来保存将额外的数据带入堆中,而不用额外的往返。

使用Graph对于支持推理显然是必不可少的,尽管它比使用ARQ StageGenerator慢,因为它可以查询一组三重模式,但这使得必须始终使用SPARQL,这看起来有点不灵活。

到目前为止,最佳解决方案似乎是:

  • 实现(可能是只读的) 图 - 说“HibernateGraph”
  • 让HibernateGraph检查一下 Hibernate PersistenceContext对象 并返回三角形的头部 自定义迭代器。
  • 当迭代器到期加载页面时 使用数据库从数据库中获取数据 标准接口。
  • 对于具有已知谓词的查询 URI将URI映射到列并使用 投影紧张,否则加载 整个对象并迭代 getter,将getter名称映射到a URI。
  • 在其他情况下使用简单方案映射,例如每个主题等http://root/url/instances/EntityName/id
  • 创建一个允许的辅助对象 使用自定义执行SPARQL StageGenerator。
  • StageGenerator应该包装 内置于StageGenerator。
  • 在自定义阶段生成器传递中 查询除了a之外的图表 HibernateGraph向上链 内置于StageGenerator。
  • 同时跳过任何三重模式集 没有优化的 解决方案,例如任何一种模式。
  • 优化查询的位置 实现,运行相应 标准功能和映射 逐个细胞结果为三倍 之前。

还有另一个名为OpExecutor的SPI可能有助于将FILTER解析推送到数据库中,从而进一步提高性能。

目前我已将此作为一个侧面项目,我可能会将其作为LGPL软件发布。