3

Сценарий: простая адресная книга, в которой пользователь может создавать свои собственные контакты и организовывать их, добавляя их группами. Контакт может иметь несколько адресов.Схема схемы схемы базы данных - подходит ли она для neo4j?

Я создал следующую схему: [схема-дизайн] [1]

Я хочу, чтобы запросить все контакты, которые размещены в группе х и жить в стране у.

Этот дизайн схемы достаточно хорош для этих целей (я хочу использовать базу данных neo4j)?

ответ

3

Похоже, что понятие country должно быть гражданином первого класса на вашем графике, так как ваш запрос зависит от него. Дизайн графических моделей, как правило, сильно зависит от ваших шаблонов запросов.

Поэтому я предлагаю иметь узел с пометкой Country для каждой страны и подключить узел Address с :LOCATED_IN отношениями с этой страной. (следовательно, отбросить свойство страны из адресных узлов).

С этим изменить запрос так же легко, как:

MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->()-[:LOCATED_IN]->(:Country{name:'US'}) 
RETURN contact 
+0

Спасибо! Я ценю это. – Moody

+0

Кстати, Стефан, вы случайно имеете какое-либо сравнение статистических данных о том, насколько плотные узлы влияют на производительность в таких случаях? Скажем, у меня есть ~ 20K узлов с свойством 'Prop' (возможно, также проиндексировано на нем), и я запрашиваю DB только для того, чтобы найти все узлы, которые имеют' Prop', а затем фильтруют конкретное значение 'Prop' (количество возможных значений Prop довольно мало: я могу перечислить их всех (скажем, 1000 возможных значений)). Было бы лучше, если бы я создал ярлык «Prop» и создал для него отношения 20K? Какой был бы лучший выбор по производительности? – tkroman

+0

вам необходимо знать, что вы можете столкнуться с проблемами блокировки, если одновременно подключаете много адресов к одной стране. Создание отношения означает также блокировку его начального и конечного узлов. Однако вы можете легко обойти это, имея пару «стыковочных узлов» по ​​всей стране. Затем адрес выбирает один стыковочный узел, например. путем последовательного хеширования по идентификатору потока - это предотвращает проблемы с блокировкой. На стороне запроса у меня нет доступных измерений. –

2

Один вариант иметь другой узел с адресом для страны, как отметил Стефаном Армбрустера. Если вы не хотите изменять структуру данных, просто добавьте индекс в поле «страна» адреса. Тогда вы можете иметь запрос

MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->(:Address{country:'US'})

+0

Спасибо. Я ценю подсказку! – Moody

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