图表数据库与三重商店 - 何时使用哪个?

时间:2015-05-11 11:03:40

标签: neo4j sparql graph-databases orientdb triplestore

我知道Stackoverflow上有类似的问题,但我觉得他们没有回答以下问题。

图形数据库到我理解的商店数据主要遵循这个模式:

Table/Collection 1: store nodes with UID
Table/Collection 2: store relations referencing nodes via UID

这允许存储任意类型的图形。现在据我所知,三重商店只存储三元组:

Triple/Collection 1: store triples (2 nodes, 1 relation)

现在,我将看到有关用例的以下区别:

  • 图形数据库:当您知道静态连接时
  • 三重存储:当您有松散连接的节点并且经常寻找新连接时

我很困惑的是,人们似乎根据这些标准没有讨论使用哪一个。我发现的大多数文章都在谈论速度或兼容性等论点。但这不是最重要的一点吗?

反过来说:

  • 想象一下,有一个清晰连接的,用户定义的图形。为什么你只想将它存储为三元组,丢失所有关于连接的信息?或者必须实施一些在三subject中存储ID的自定义解决方案。
  • 想象一下,使用SPARQL松散地收集了要查询未知关系的节点。图数据库支持这一点。但为此他们必须建立另一个我认为会更慢的指数吗?

编辑: 我看到"失去关于连接的信息"这是错误的方式。如果你按照接受的答案所示进行操作,并为2个节点+ 1个关系插入几个三元组,那么你可以保留所有信息,特别是信息确切的节点连接的信息。

2 个答案:

答案 0 :(得分:67)

图形数据库和三重存储之间的主要区别在于它们如何为图形建模。在三重存储(或四元组存储)中,数据往往非常原子。我的意思是"节点"在图中,往往是原始数据类型,如字符串,整数,日期等。关系将基元链接在一起,因此话语的单位和#34;在三重商店中,通常是三元组,而不是节点或关系。

相比之下,其他图形数据库通常被称为"属性存储"因为节点是与域中的对象相对应的数据容器。节点代表一个对象,并具有属性;它们充当图形建模器指定的丰富数据类型,而不仅仅是原始数据类型。在这些图形数据库中,节点和关系是话语的单位"。

让我们说我有一个名叫" Bob"谁知道"苏珊"。在RDF中,它将是这样的:

<http://example.org/person/1> :hasName "Bob".
<http://example.org/person/1> foaf:knows <http://example.org/person/2>.
<http://example.org/person/2> :hasName "Susan".

在像neo4j这样的图形数据库中,它将是:

(a:Person {name: "Bob"})-[:KNOWS]->(b:Person {name: "Susan"})

请注意,在RDF中,它有3个关系,但这些关系中只有一个实际表达了两个实体之间的语义。另外两个关系只是跟踪单个更高级别实体(人员)的属性。在neo4j中,它是两个节点之间的 1 关系,每个节点都有一个属性。在RDF中,您倾向于通过URI识别事物,在neo4j中它是一个自动获取数据库ID的数据库对象。这就是我对更原子/原始商店(三重商店)和更丰富的属性图之间的区别的意思。

RDF和三重存储主要是针对您在语义网中遇到的各种架构挑战而构建的。例如,XML架构是基于架构假设而构建的,您将混合使用许多不同的词汇表和命名空间。 (这是一个非常&#34;语义网&#34;假设)。因此,在SPARQL和RDF中,您通常会看到至少同时使用xsdrdfrdfs命名空间,并且可能还owl 1}},skos和其他许多人。 SPARQL和RDF / RDFS还有许多钩子和功能,这些钩子和功能明确地使得本体推理更容易。您倾向于使用URI标识事物,以此作为指定标识符的方式&#34;但也因为有些人可能想要取消引用URI ...这里的假设再次是多方之间的广泛数据共享安排。

相比之下,属性存储是针对不同用例的关键,例如在一个模型/命名空间内对数据进行灵活建模,在对象和图形之间进行映射以实现企业应用程序的持久性,快速进化等等。您将倾向于使用您自己的方案(或内部数据库ID)识别事物。对于网络上的任何随机消费者而言,自动递增整数可能不是最佳形式的ID(并且它们当然不能像URL那样被取消引用),但它们可能不是您对公司内部应用程序的第一个想法。

哪个更好?更原子的三重商店格式,还是丰富的属性图?您是否需要在一个查询或数据模型中混合和匹配许多不同的词汇表?您是否需要创建OWL本体或进行推理?你需要将内存中的一堆java对象序列化到数据库吗?你需要快速遍历长路径吗?这些类型的问题将指导您的选择。

图表是图表,两者都是图表,所以我不认为他们可以代表什么,或者你如何考虑问题在#34中存在很大差异;图表术语&#34;。差异归结为引擎盖下的架构,以及您认为自己需要的各种用例。我不会告诉你一个比另一个好,但明智地选择。

答案 1 :(得分:0)

(回复对此答案的评论:https://stackoverflow.com/a/30167732

当定义了owl:inverseOf生产规则时,推理者会在添加或更新商店或从商店中进行选择时推断出逆属性三元组。这是一种“物化关系”

Schema.org-RDFS词汇表-例如,将https://schema.org/isPartOf定义为hasPart的逆属性。如果两者都指定,则无需运行另一个图形模式查询就可以在另一个方向上遍历有向关系。 (:book1 schema:hasPart?o),(?o schema:isPartOf:book1),(?s schema:hasPart:chapter2)

使用RDFS和OWL来描述neo4j属性图及其内部的模式当然是可能的;但没有理由例如推断逆属性或进行模式验证。

neo4j是否无法存储任何RDF图? RDF具有对象的数据类型和语言:您需要在指定了数据类型和/或语言的情况下对属性进行修饰(并且您将重新实现定义良好的语义)

每个neo4j图都可以用RDF表示吗?是的。

RDF是图形的一种表示形式,其中有许多商店实现已针对插入和查询性能等各种用例进行了优化。

鉴于所有neo4j图都可以表示为RDF,将neo4j与特定的三元组(在推理支持下)进行比较可能会更有用。