2016-04-16 3 views
1

Скажем, у нас есть база данных Neo4j с несколькими подграфами в 50000 узлов. Каждый подграф имеет корень. Я хочу найти все узлы в одном подграфе.Метки и свойства Neo4j и их отличия

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

Один из способов, чтобы добавить идентификатор подграф для каждого узла:

MATCH(n {subgraph_id:{my_graph_id}}) return n 

Другим способом было бы связать каждый узел в подграфа в корне подграфа:

MATCH(n)-[]->(root:ROOT {id: {my_graph_id}}) return n 

Это чувствует себя более " графикой ", если это имеет значение. Кажется дорогим.

Или я мог бы добавить метку для каждого узла. Если {my_graph_id} был «BOBS_QA_COPY», то

MATCH(n:BOBS_QA_COPY) return n 

бы выкопать все узлы подграфа.

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

Установка метки для идентификации конкретного подграфа заставляет меня чувствовать себя странно, как будто я злоупотребляю инструментом. Я ожидаю, что лейблы скажут , что что-то есть, а не , которое экземпляр чего-то.

Например, если бы мы отображали информацию о машине, я мог видеть, что у вас есть части, обозначенные как «FORD EXPLORER». Но я не уверен, что имеет смысл иметь части, обозначенные как «TONYS FORD EXPLORER». Теперь я мог видеть (идентификатор пользователя: «Тони»), имеющее отношение к графику FORD EXPLORER ...

я могу быть с приступом «SQL мозга» ...

+0

50K узлов много - вам действительно нужны все сразу? –

ответ

2

Давайте работать это через , шаг за шагом.

  1. Если есть N некорневых узлы, добавив дополнительные N ROOT отношений делает наименьшее смысл. Это очень дорогостоящий в хранилище, он будет загрязнять модель данных отношениями, которые не должны быть там, и которые могут излишне усложнять запросы, которые хотят пересекать пути, и это не самый быстрый способ найти все узлы в подграф.

  2. Добавление подграф ID свойство каждого узла также является дорогостоящим в памяти (но в меньшей степени), и для этого потребуется либо: (а) сканирование каждый узел, чтобы найти все узлы с определенным ID (медленно), или (b) с использованием индекса, скажем, :Node(subgraph_id) (быстрее). Подход (b), который является предпочтительным, также требовал бы, чтобы все узлы имели одинаковый знак Node.

  3. Но подождите, если подход 2 (b) уже требует, чтобы все узлы были помечены, почему бы нам просто не использовать различный ярлык для каждой подгруппы? Делая это, нам не нужно свойство subgraph_id, и нам также не нужен индекс! И найти все узлы с одной и той же меткой быстро.

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

+0

Одной из проблем с меткой каждой подгруппы является то, что индексы включены: Ярлык (свойство) - если требуется функция индекса, нужно создать каждую метку подгруппы. –

+0

@TimKuehn. Это не большая проблема, если не так много подгрупп. Если их много, то вы также можете дать каждому узлу дополнительную общую метку и использовать ее для всех общих индексов. – cybersam

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