我试图理解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
这对我来说看起来很奇怪,更重要的是,当我们从一个来源添加所有年份的值时会发生什么?我们会有多种关系或什么?
如果我的问题太愚蠢,我很抱歉,如果有人向我解释或向我展示要阅读的书/文章,我会很高兴。
提前致谢。 :)
答案 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"组织和国家之间,不多也不少。
希望有所帮助:)