2014-01-23 3 views
0

Позвольте мне объяснить, что я хочу, чтобы моделировать с помощью Neo4j (v2)дизайн Neo4j граф базы данных и эффективный запрос

Пусть предполагать п-мерный массив данных о форме:

val1Dim1, ... , val1Dimn, classValue1 
val2Dim2, ... , val2Dimn, classValue2 
.... 

Каждое измерение имеет иерархию (скажем, дерево). Общее количество «узлов измерения» составляет около 1 Кб или немного выше в зависимости от набора данных.

Подход данных (link to the scientific paper) запущен над набором данных, и огромное количество шаблонов извлекается из набора данных.

В принципе, каждый шаблон на форме:

{a set of value of Dim1} {a set of value of Dim2} ... {a set of class values} 

Существуют, по крайней мере, около 11M добывали узоры.

Мой выбор дизайн

2 типа узлов (метки):

  • DATA (например val1Dim1 является узлом DATA) => около 1К узлов. Эти узлы имеют три свойства: LABEL (само значение), идентификатор размера, DIMENSION и встроенное свойство KEY, которое является «DIMENSION_LABEL». Индекс был определен в KEY.

  • ОБРАЗЕЦ (по одному на каждый шаблон) => по крайней мере узлов 11M

2 типа отношений:

  • ЯВЛЯЕТСЯ для представления связи обобщения/специализации для навигации по иерархии

  • COMPOSED_BY, чтобы связать шаблон с каждым его членом (например, если P = {val1dim1, val2Dim1} {val1Dim2} - это шаблон, то 3 ссылки т. е. P-> va11Dim1, P-> val2Dim1 и val1Dim1.

Вот это игрушка graphDb, чтобы сделать свой выбор дизайна ясно enter image description here

вставки данных и спецификации

Я использовал партии вставки и ее работы довольно быстро (около 40 минут). Размер БД составляет около 50 ГБ и состоит из 11М узлов и 1В (!!) отношений. На данный момент я запускаю код на своей машине (8 ГБ оперативной памяти, Intel i7 и 500 ГБ SSD HD). Я использую Java.

То, что я хотел бы сделать

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

В настоящее время, при условии, 2 размеров запроса я использую для достижения своей цели является:

match (n:DATA {KEY:'X'})-[r:COMPOSED_BY]-(p:PATTERN)-[r2:COMPOSED_BY]-(m:DATA {KEY:'Y'}) 
return p; 

В настоящем время, это очень-очень медленно ... И использование памяти процесса Java 2 Гб (максимум)

Мои вопросы

  1. как вы думаете, graphDb присваивается для такого сценария?
  2. Являются ли мои варианты дизайна хорошо?
  3. Как насчет индексов? Должен ли я определить еще немного?
  4. Можно ли запросить db в порядке?
  5. Есть ли какие-то настройки для ускорения фазы запроса?
  6. Каковы будут характеристики сервера, которые удовлетворяют моим приложениям?

Заранее спасибо

Йоанна

+0

Вы можете разместить фиктивную схему вашего графика, так что я могу представить себе лучшую модель, прежде чем положить в комментариях? –

+0

@SumeetSharma Я отредактировал мое сообщение. Благодарю. –

ответ

1

У меня есть несколько предложений. Вы можете использовать Node Labels (не как свойство узла). Для получения дополнительной информации об обозначениях узлов см. here

Так что, если вы используете метки, все ярлыки определенного размера будут автоматически классифицироваться под одним набором (например, меткой). Следовательно, вы уменьшите количество отношений, которые вы поддерживаете как IS_A. И поскольку отношения более дорогие пространства, вы можете уменьшить размер вашей базы данных. Кроме того, индексированные поисковые запросы на ярлыках также доступны и быстро, чем поиск ключей во всем индексе.

В приведенных ниже моделях при каждой размерности узла (DATA) Я добавил два атрибута key и value, вы можете достаточно сохранить только один из них как key, а затем просто индекса над ней. Поэтому, когда вам понадобится значение, просто проанализируйте ключ. (Просто предложение не знает о том, какие у вас будут у вас)

Предложения и комментарии приветствуются.

комментарий, если вам нужна дополнительная информация.


Редактировать после комментария

В соответствии с Вашим комментарием, с тем чтобы уменьшить количество узлов шаблона вы можете связать DATA узлы самостоятельно, создавая уникальный relationshipTypes называя их по PATTERNS. Смотрите обновленную схему для более разъяснений

Model I would suggest

+0

Спасибо за ваши предложения. Дело в том, что я уже использую метки для выделения узла данных (в белом) и узлов шаблонов (в сером цвете). На самом деле, не так много отношений IS_A (около 1K).Моя основная проблема - количество шаблонов (11M) и, следовательно, количество COMPOSED_BY отношений (200M). Типичный запрос, который я хочу запустить, «задан некоторыми узлами данных N, какими являются шаблоны p, так что существует связь COMPOSED_BY между p и каждым узлом данных в N». –

+0

Также используемые вами метки - DATA .. Я предполагал, что вместо использования DATA в качестве метки используйте A/DIM1 или B/DIM2 в качестве метки, которая будет разделять ваш набор узлов в измерении под отдельными наборами. Вместо создания узла шаблона, создайте уникальные шаблоны отношений named p1, p2, связывающие множество узлов в шаблоне. –

+0

Ваша идея выглядит очень интересной. Я буду исследовать его прямо сейчас и информировать вас о влиянии на выступления. Кроме того, как вы думаете, отношения автоиндексации значительно ускорили бы запросы? –

Смежные вопросы