我有一个类似RDF的图形数据结构,即由不同类型的边(属性,关系)连接的节点(实体)组成。用户将在该图中选择一个节点(数百万个节点,数亿个边缘),我正在寻找一种快速显示所选节点“接近度”的方法(即一个或两个级别的节点,是通过一组可能指定的关系到最初选择的节点的路径。)
我做了一些研究,遇到了RDF专用的三重商店和更通用的图形数据库,如neo4j和allegro。然后还有像jena和芝麻这样的中间件产品。
您是否建议使用三重存储或图形数据库来有效查询附近的连接节点?中间件在这里发挥作用吗?我知道在每种情况下,将完整的图形保存在内存中可能会有所帮助。
亚历山大
答案 0 :(得分:6)
我会推荐一个RDF商店(Jena,Sesame,4store,Virtuoso,OWLim,Oracle等)。然后,您可以只学习解决方案的SPARQL查询,并在各种系统中进行尝试,而无需为不同的API编写代码。
你可以采取几种方法,最容易的是使用不同路径的UNION查询,你可以使用一个变量作为边缘URI并添加一个FILTER来限制它只是你感兴趣的那些。
答案 1 :(得分:3)
为了澄清,我不会将Jena和/或Sesame归类为中间件。它们都具有本机存储和索引。
Jena有TDB使用B + Tree索引。特别是对于默认图表,您有三个索引:SPO,POS和OSP。
在您的情况下,SPO索引将用于为您提供给定主题的所有三元组。 如果你想要两个级别,你需要多次触摸索引:一个用于初始主题,一个用于修正到主题的每个对象。
TDB使用内存映射文件来缓存索引,因此如果你有足够的RAM,它应该不是问题。
您想要做的事情非常接近RDF社区中人们用来呼叫Concise Bounded Description(CBD)的内容,但是如果您想要两个或更多级别的深度,您需要自己实现。 SPARQL查询语言为您提供了一个可以使用的DESCRIBE(但它只有一个级别)。
最后但并非最不重要的是,你说你有一个类似RDF的图形数据结构,但它不是RDF。出于这个原因,您应该在RDF中转换数据或放弃使用三重存储的想法,因为它们旨在加载和管理RDF数据。即使您实际上只能使用存储和索引层的一部分来构建和使用自己的自定义索引。
最好的做法是对您的数据进行实验,并比较不同的解决方案如何与您的用例一起使用。