【发布时间】:2015-07-21 20:37:24
【问题描述】:
我知道 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)
现在我会看到以下关于用例的区别:
- 图形数据库:当你知道静态连接时
- 三重存储:当您有松散连接的节点并且经常寻找新的连接时
人们似乎没有根据这些标准讨论使用哪一个,这让我感到困惑。我发现的大多数文章都在谈论速度或兼容性等论点。但这不是最相关的一点吗?
反过来说:
- 想象一下,有一个清晰连接的用户定义图。为什么你只想将它存储为三元组,而丢失有关连接的所有信息?或者必须实现一些自定义解决方案,将 ID 存储在三元组
subject中。 - 想象一下,您想要使用 SPARQL 查询未知关系的松散收集节点。图形数据库确实支持这一点。但是为此他们必须建立另一个我认为的索引并且会更慢?
编辑: 我看到“丢失有关连接的信息”是错误的说法。如果您按照接受的答案中所示进行操作并为 2 个节点 + 1 个关系插入多个三元组,那么您将保留所有信息,特别是连接了哪些确切节点的信息。
【问题讨论】:
-
"三重存储只存储三重" 许多(大多数?)三重存储(即,对于 RDF)实际上是 quad 存储,因为它们有一个概念(来自 SPARQL 数据集) 的命名图。由于每个三元组都存在于图中,因此基本项实际上是 (graph,subject,predicate,object)。
-
"三元组/集合 1:存储三元组(2 个节点,1 个关系)" 不过,顺序很重要。它不是无向边,所以它实际上是(源、关系、目标),或者更常见的是(主语、谓词(或属性)、宾语)。跨度>
-
“你到底为什么只想将它存储为三元组,而丢失 [原文如此] 有关连接的所有信息?”我不确定你在这里的意思。该属性由 URI/IRI 标识,它与 UID 一样通用,只是它更容易记住,可以引用(以便您可以获得有关它的更多信息等),并且主体和客体通常是 URI 或数据字面量。哪些连接信息丢失了?
-
OP 您的标准“静态连接与松散连接的节点”在我看来并不是解决问题的好方法。我认为这两种技术都支持。就像@JoshuaTaylor 所说,我认为 SPARQL/RDF 不会丢失任何关于连接的内容,这只是您选择建模/捕获的问题。
-
我看到“丢失有关连接的信息”是错误的说法。如果您按照接受的答案所示进行操作并为 2 个节点 + 1 个关系插入几个三元组,那么您将保留所有信息,特别是连接了哪些确切节点的信息。感谢所有 cmets!
标签: neo4j sparql graph-databases orientdb triplestore