2013-03-16 4 views
1

Я пытаюсь понять идею баз данных noSQL, а точнее, концепцию базы данных диаграммы neo4j. У меня есть опыт работы с базами данных 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 

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

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

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

ответ

3

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

всегда легче начать думать о вопросах вы хотите ответить с вашими данными до моделируя его спереди.

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

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

Кроме того, ЦРУ/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 

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

Хотя 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/!

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

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

+0

Большое спасибо за ваш очень описательный ответ. Еще один вопрос: если мы расширим наш пример Китая и добавим данные в соседние страны, скажем, Россия, я думаю, мне пришлось бы делать исходящие и входящие отношения ': HAS_BORDER_COUNTRY {borderLength: 1000}' между Китаем и Россией? Что лучше - иметь свойство 'totalBorderLength' в узле Китая, или лучше будет суммировать свойство' borderLength' отношений 'HAS_BORDER_COUNTRY'? Я должен еще немного поработать с базой данных, чтобы лучше понять ее. – suricactus

+0

Добро пожаловать :) Опять же, это немного сложно сказать, не имея в виду случаи использования. Из того, что вы описали, мои 2 цента будут идти для суммирования borderLength. – Rolf