对象数据库简介

时间:2013-03-16 14:14:28

标签: nosql neo4j graph-databases concept

我试图理解noSQL数据库的概念,更准确地说,是neo4j图数据库背后的概念。我有SQL数据库(MySQL,MS SQL)的经验,但管理分层数据的局限性使我扩展了我的知识。但现在我有一些问题,我找不到他们的答案(也许我不知道要搜索什么)。

想象一下,我们有世界各国的名单。每个国家每年都有GDP。每个国家都有不同来源计算的GDP - 世界银行,他们的政府,中央情报局等。在这种情况下组织数据的最佳方法是什么?

最简单的想法是让节点(值是虚构的)

China:
  GDPByWorldBank2012: 999,
  GDPByCIA2011: 994,
  GDPByGovernment2012: 1102,

在关系数据库中,我会将数据分成三个表:国家,来源和价值观,其中的价值观我会得到GDP,年份,国家ID和来源ID。

其他想法是创建节点CIA,世界银行,但节点政府看起来很奇怪。尽管如此,我们的想法是建立关系( valueIfGDP ):

CIA -> valueOfGDP - {year: 2011, value: 994} -> China
World Bank -> valueOfGDP - {year: 2012, value: 999} -> China

这对我来说看起来很奇怪,更重要的是,当我们从一个来源添加所有年份的值时会发生什么?我们会有多种关系或什么?

如果我的问题太愚蠢,我很抱歉,如果有人向我解释或向我展示要阅读的书/文章,我会很高兴。

提前致谢。 :)

1 个答案:

答案 0 :(得分:3)

您的问题非常合法,并且您不是唯一一个难以掌握图形建模的人;)

在预先建模之前,开始考虑用数据回答的问题总是比较容易。

让我们想象一下,你想要检索所有国家的CIA计算的2012年GDP。

实现此目的的一种简单方法是统一标记国家/地区节点,并设置显然取决于国家/地区名称的属性名称。

此外,CIA / WorldBank / Government在这个领域都是"来源",让我们统一标记它们。

例如,可以提供类似的内容:

(ORGANIZATION {name: CIA})-[:HAS_COMPUTED_GDP {year:2011, value:994}]->(COUNTRY {name:China})

使用Cypher查询语言,遵循此模型,您将执行以下查询:

START cia = node:nodes(name = "CIA")
MATCH cia-[gdp:HAS_COMPUTED_GDP]->(country)
WHERE gdp.year = 2012
RETURN cia, country, gdp

在这个查询中,我使用索引查找作为起点(而不是不应该使用的内部技术概念的ID)来按名称检索CIA并匹配相关的子图以最终返回CIA, GDP关系及其相关联的国家与输入约束相匹配。

尽管Neo4J完全没有模式,但这并不意味着你必须拥有一个完全灵活的数据模型。拥有一个小结构将始终有助于使您的查询或遍历更容易阅读。

如果您不熟悉Cypher查询语言(是读取数据或将数据写入图表的唯一方法),请查看Neo4J(Cypher)的优秀文档:http://docs.neo4j.org/chunked/stable/cypher-query-lang.html,填写:http://docs.neo4j.org/chunked/stable/index.html)并在那里尝试一些查询:http://console.neo4j.org/

要回答你的第二个问题,如果你想再增加一年的GDP计算,这将归结为增加新的关系" HAS_COMPUTED_GDP"组织和国家之间,不多也不少。

希望有所帮助:)

相关问题