1

我试图理解 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

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

如果我的问题太愚蠢,我很抱歉,如果有人解释我或告诉我要读什么书/文章,我会很高兴。

提前致谢。:)

4

1 回答 1

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”,不多不少。

希望能帮助到你 :)

于 2013-03-16T16:49:19.680 回答