1

私は、noSQL データベースの概念、より正確には、neo4j グラフ データベースの背後にある概念を理解しようとしています。私は SQL データベース (MySQL、MS SQL) の経験がありますが、階層データを管理する際の制限により、知識を広げることができました。しかし、今はいくつか質問がありますが、その答えが見つかりません (何を検索すればよいか分からないかもしれません)。

世界の国のリストがあるとします。各国には毎年GDPがあります。各国の GDP は、世界銀行、政府、CIA など、さまざまな情報源によって計算されています。この場合、データを整理する最善の方法は何ですか?

頭に浮かんだ最も簡単なことは、ノードを持つことです(値は虚数です)

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

リレーショナル データベースでは、データを国、ソース、値の 3 つのテーブルに分割します。値には、GDP の値、年、国の ID、ソースの ID があります。

頭に浮かんだ他のことは、ノードCIA、世界銀行を作成することですが、ノード政府は本当に奇妙に見えます. それでも、アイデアは関係を持つことです(valueIfGDP):

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

これは私にはかなり奇妙に思えます。さらに、1 つのソースからすべての年の値を追加するとどうなるでしょうか? 私たちは複数の関係を持ちますか、それとも何ですか?

私の質問が愚かすぎて申し訳ありません.

前もって感謝します。:)

4

1 に答える 1

3

あなたの質問は非常に正当であり、最初にグラフモデリングを理解するのが難しいのはあなただけではありません;)

データを前もってモデル化する前に、データで答えたい質問について考え始める方が常に簡単です。

すべての国の CIA によって計算された 2012 年の GDP を取得したいとします。

これを実現する簡単な方法は、国ノードに一様にラベルを付け、明らかに国名に依存する属性名を設定することです。

さらに、このドメインの CIA/WorldBank/Government はすべて「情報源」なので、それらにも同じようにラベルを付けましょう。

たとえば、次のようになります。

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

Cypher Query Language では、このモデルに従って、次のクエリを実行します。

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

このクエリでは、名前で CIA を取得し、関連するサブグラフを照合して最終的に CIA、GDP 関係、およびその入力制約に一致するリンクされた国。

Neo4J は完全にスキーマレスですが、完全に柔軟なデータ モデルが必要であるとは限りません。少しの構造を持つことは、クエリやトラバーサルを読みやすくするのに常に役立ちます。

Cypher Query Language (グラフにデータを読み書きする唯一の方法ではない) に慣れていない場合は、Neo4J の優れたドキュメント (Cypher: http://docs.neo4j.org/chunked ) を参照してください。 /stable/cypher-query-lang.htmlを完成させます: http://docs.neo4j.org/chunked/stable/index.html ) そしてそこでいくつかのクエリを試してください: http://console.neo4j.org/ !

そして、2 番目の質問に答えるために、GDP 計算をもう 1 年追加したい場合、これは組織と国の間に新しい関係「HAS_COMPUTED_GDP」を追加することになります。それ以上でもそれ以下でもありません。

それが役に立てば幸い :)

于 2013-03-16T16:49:19.680 に答える