图形数据库和三元组存储的主要区别在于它们如何对图进行建模。在三元组存储(或四元组存储)中,数据往往非常原子化。我的意思是图中的“节点”往往是基本数据类型,例如字符串、整数、日期等。关系将原语链接在一起,因此三元组通常是一个“话题单元”,而不是节点或关系。
相比之下,其他图形数据库通常被称为“属性存储”,因为节点是与域中的对象对应的数据容器。一个节点代表一个对象,并具有属性;它们是由图形建模者指定的丰富数据类型,而不仅仅是基本数据类型。在这些图形数据库中,节点和关系是“话题单元”。
假设我有一个名为“Bob”的人,他认识“Susan”。在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命名空间是内置的,并基于架构假设,即您将混合和匹配使用许多不同的词汇和命名空间。因此,在SPARQL和RDF中,您通常会同时看到
xsd
,
rdf
和
rdfs
命名空间的使用,可能还包括
owl
,
skos
和许多其他命名空间。 SPARQL和RDF / RDFS还具有许多钩子和功能,专门用于使本体推理等任务更加容易。您通常会使用URI标识事物作为“名称空间标识符”的一种方式,但还因为有些人可能想解除URI的引用……再次强调这里的假设是许多方之间存在广泛的数据共享安排。
相比之下,属性存储针对不同的用例进行了优化,例如灵活建模一个命名空间内的数据、对象和图形之间的映射,以实现企业应用程序的持久性,快速的可扩展性等。您通常会使用自己的方案(或内部数据库ID)来标识事物。递增的整数可能不是任何随机网站用户的最佳ID形式(它们当然不能像URL那样被解引用),但它们可能不是公司内部应用程序的首选。
那么哪个更好?更原子的三元存储格式还是更丰富的属性图?您需要在一个查询或数据模型中混合和匹配许多不同的词汇吗?您需要创建OWL本体还是进行推理?您需要将一堆Java对象序列化到数据库中吗?您需要快速遍历长路径吗?这些类型的问题将指导您的选择。
图形就是图形,它们都可以表示图形,因此我认为在“图形术语”中思考问题的方法没有太大区别。区别归结于引擎下面的架构,以及您认为需要哪些用例。我不会告诉您哪个更好,但要明智地选择。