我使用 Jena 和 TDB 来存储 RDF,我想对它做一些推断。但是 RDF 数据很大,Jena 的猫头鹰推理器必须将所有数据加载到内存中。所以我想找到一个推理器,可以在不将所有数据加载到内存的情况下进行推理,有没有一个?
3 回答
并不真地。DL 推理即使在小规模下也难以计算。有大量数据,这不适用于现有方法。在二级存储上做这件事仍然是一个开放的研究问题。
但是,存在各种 OWL 配置文件来解决这个问题。它们都有不同的计算复杂性,这些都比深度学习“更容易”,这使得它们更适合大规模推理。特别是,QL 专为查询时间推理而设计,根据我的经验,它往往具有非常小的内存占用,而 RL 可以使用标准规则推理器来实现。
因此,如果您不需要使用 DL,那么我会使用支持其中一个配置文件的工具,并且您应该从中获得相当不错的收益。
作为参考,您可能会发现这份关于各种 OWL 方言的计算复杂性的文档很有趣。
如果您准备采用 OWL 的一个子集,您可以以流处理方式执行某些操作,而无需将所有 RDF 数据加载到内存中,这将实现所有推断的三元组。
举个例子,看看 RIOT 的 infer 命令:
源代码在这里:
- https://svn.apache.org/repos/asf/incubator/jena/Jena2/ARQ/tags/jena-arq-2.9.0-incubating/src/main/java/riotcmd/infer.java
- https://svn.apache.org/repos/asf/incubator/jena/Jena2/ARQ/tags/jena-arq-2.9.0-incubating/src/main/java/org/openjena/riot/pipeline/inf/推理处理器RDFS.java
- https://svn.apache.org/repos/asf/incubator/jena/Jena2/ARQ/tags/jena-arq-2.9.0-incubating/src/main/java/org/openjena/riot/pipeline/inf/ InferenceSetupRDFS.java
使用 RIOT 的推断并将其与 MapReduce 之类的东西并行运行是微不足道的,示例如下:
另一种使用 MapReduce 应用 RDFS 和 OWL ter Horst 规则并实现所有派生语句的不同方法在这里:
也许,您可以查看您感兴趣的 OWL 部分,并检查您是否可以以流媒体方式进行操作。如果是这样,您可以使用 RIOT 的推断并对其进行扩展,添加您感兴趣的 OWL 部分。这将是对 Apache Jena 的一个很好的贡献(如果您想这样做,请与 jena-dev 邮件列表联系) .
WebPIE 是一个聪明而有趣的项目,但正如您所见,它有点复杂,而且它是一个研究项目(从长期支持和维护的角度来看,这意味着)。但是,如果您想要/需要的是 OWL ter Horst,WebPIE 就可以了。如果其他人有兴趣使用它,您甚至可以付出努力,分叉 WebPIE 并将其贡献给开源项目。
您可能也有兴趣查看 Ymris(但这目前正在睡觉...... zzzzz):
您可能想尝试 GRAKN.AI,它们对分布式系统中的持久数据进行实时推理。