Введение в объектные базы данных

Я пытаюсь понять идею баз данных noSQL, точнее, концепцию базы данных neo4j graph. У меня есть опыт работы с базами данных SQL (MySQL, MS SQL), но ограничения управления иерархическими данными заставили меня расширить свои знания. Но теперь у меня есть некоторые вопросы, и я не могу найти ответы на них (возможно, я не знаю, что искать).

Представьте, что у нас есть список стран мира. Каждая страна имеет свой ВВП каждый год. В каждой стране ВВП рассчитывается из разных источников - Всемирного банка, их правительства, ЦРУ и т. д. Как лучше организовать данные в этом случае?

Самое простое, что пришло в голову, это иметь узел (значения мнимые):

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

В реляционной базе данных я бы разделил данные на три таблицы: страны, источники и значения, где в значениях у меня было бы значение ВВП, год, идентификатор страны и идентификатор источника.

Другая вещь, которая пришла в голову, это создать узлы ЦРУ, Всемирный банк, но узел правительства выглядит очень странно. Несмотря на это, идея состоит в том, чтобы иметь отношения (valueIfGDP):

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

Для меня это выглядит довольно странно, более того, что происходит, когда мы складываем значения за все годы из одного источника? У нас будет несколько отношений или что?

Извините, если мои вопросы слишком глупы, и я был бы рад, если бы кто-нибудь объяснил мне или показал мне, какую книгу/статью прочитать.

Заранее спасибо. :)


person suricactus    schedule 16.03.2013    source источник


Ответы (1)


Ваши вопросы очень законны, и вы не единственный, у кого сначала возникают трудности с пониманием графового моделирования;)

Всегда легче начать думать о вопросах, на которые вы хотите ответить с помощью ваших данных, прежде чем моделировать их заранее.

Давайте представим, что вы хотите получить ВВП всех стран за 2012 год, рассчитанный ЦРУ.

Простой способ добиться этого — единообразно пометить узлы страны и установить имя атрибута, которое, очевидно, зависит от названия страны.

Более того, ЦРУ/Всемирный банк/правительство в этой области все являются «источниками», давайте также назовем их одинаково.

Например, это может дать что-то вроде:

(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

В этом запросе я использовал поиск по индексу в качестве отправной точки (а не идентификаторы, которые являются внутренним техническим понятием, которое не следует использовать), чтобы получить 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/ !

И чтобы ответить на ваш второй вопрос, если вы хотите добавить еще один год расчета ВВП, это просто сведется к добавлению новых отношений «HAS_COMPUTED_GDP» между организациями и странами, ни больше, ни меньше.

Надеюсь, поможет :)

person fbiville    schedule 16.03.2013
comment
Большое спасибо за ваш очень описательный ответ. Еще один вопрос. Если мы расширим наш пример с Китаем и добавим данные по соседним странам, скажем, по России, я думаю, мне придется сделать исходящие и входящие отношения :HAS_BORDER_COUNTRY{borderLength:1000} между Китаем и Россией? Что лучше иметь свойство totalBorderLength в узле Китая, или лучше будет суммировать свойство borderLength отношений HAS_BORDER_COUNTRY? Я должен потратить еще немного времени, играя с базой данных, чтобы лучше понять ее. - person suricactus; 17.03.2013
comment
Пожалуйста :) Опять же, это немного сложно сказать, не имея в виду варианты использования. Судя по тому, что вы описываете, мои 2 цента пошли бы на подведение итогов borderLength. - person fbiville; 17.03.2013