8

我有一个类似 RDF 的图形数据结构,即由通过不同类型的边(属性、关系)连接的节点(实体)组成。用户将在该图中选择一个节点(数百万个节点,数亿条边),我正在寻找一种快速的方法来显示所选节点的“接近度”(即其中一个或两个级别的节点)是通过一组可能指定的关系到最初选择的节点的路径)。

我做了一些研究,发现了专门用于 RDF 的三元存储和更通用的图形数据库,例如 neo4j 和 allegro。然后还有jena、sesame等中间件产品。

你会推荐三重存储或图形数据库来提高查询附近连接节点的效率吗?中间件在这里发挥作用吗?我知道在每种情况下,将完整的图表保存在内存中可能是有利的。

亚历山大

4

2 回答 2

6

我会推荐其中一家 RDF 商店(Jena、Sesame、4store、Virtuoso、OWLim、Oracle 等)。然后,您可以为您的解决方案学习 SPARQL 查询,并在各种系统中尝试它,而无需为不同的 API 编写代码。

您可以采取几种方法,最简单的可能是具有不同路径的 UNION 查询,您可以使用边缘 URI 的变量并添加 FILTER 以将其限制为您感兴趣的那些。

于 2012-05-31T06:38:33.000 回答
3

为了澄清,我不会将 Jena 和/或 Sesame 归类为中间件。它们都有本机存储和索引。

Jena 有使用 B+Tree 索引的TDB 。特别是对于默认图,您有三个索引:SPO、POS 和 OSP。

在您的情况下,SPO 索引将用于为您提供给定主题的所有三元组。如果您想要两个级别的深度,您将需要多次触摸索引:一个用于初始主题,另一个用于纠正您的主题的每个对象。

TDB 使用内存映射文件来缓存您的索引,因此如果您有足够的 RAM,这应该不是问题。

您想要做的非常接近 RDF 社区中人们过去所说的简洁有界描述(CBD),但是如果您想要两个或更多级别的深度,则需要自己实现。SPARQL 查询语言为您提供了可以使用的 DESCRIBE(但它只有一层)。

最后但同样重要的是,您说您有一个类似 RDF 的图形数据结构,但它不是 RDF。出于这个原因,您应该在 RDF 中转换您的数据,或者放弃使用三重存储的想法,因为它们旨在加载和管理 RDF 数据。即使您实际上可以只使用存储和索引层的一部分来构建和使用您自己的自定义索引。

对您来说最好的事情是对您的数据进行实验,并比较不同的解决方案如何与您的用例一起工作。

于 2012-05-31T06:40:22.853 回答