Как я могу сохранить этот вид графика в neo4j для быстрого обхода? - PullRequest
1 голос
/ 11 марта 2010

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

Также: есть ли название для этого типа графика? Буду признателен за любую помощь / идеи.

Обновление:

Извините, что не ясно. Все узлы одного типа. Узлы имеют переменное количество групп ребер. Ровно одно ребро из каждой группы ребер должно быть выбрано для конкретного связанного компонента. Я попытаюсь объяснить на примере:

Node x1 is related to: (x2 or x3 or x4) AND (x5 or x6) AND (x7)
Node x2 is related to: (x8) AND (x9 or x10)

Итак, первая группа ребер x1 - (x2, x3, x4), вторая группа ребер (x5, x6), а третья группа ребер (x7).

Итак, вот несколько связанных компонентов, в которых существует x1:

CC1:

x1 is related to: x2, x5, x7
x2 is related to: x8 x9 

CC2:

x1 is related to: x2, x6, x7
x2 is related to: x8, x9

КК3:

x1 is related to: x3, x5, x7

CC4:

x1 is related to: x3, x6, x7

и т.д.

Я благодарен за вашу помощь в этом.

Update2:

Я думаю, что смогу сделать это, если есть ответ на этот вопрос: Как я могу указать, какой тип отношений использовать в качестве функции текущего узла на каждом шаге обхода с neo4j?

Ответы [ 2 ]

1 голос
/ 11 марта 2010

Как я понимаю ваш вопрос, у вас есть несколько узлов, давайте назовем их X узлов , которые связаны с множеством узлов типа (или чем-то похожим), давайте назовем эти узлы Т узлов . X-узел может иметь подключения к нескольким T-узлам, но только одно подключение к каждому T-узлу или, возможно, только одно подключение к каждому виду T-узла (здесь ваше описание немного размыто).

Я бы смоделировал это, используя один RelationshipType для каждого (вида) T-узла. Затем вы можете использовать x_node.getRelationships (T_TYPE_ONE, T_TYPE_TWO, ... и т. Д.), Чтобы получить все T-узлы из X-узла. Когда вы изменяете X-узел, вам нужно поддерживать свой инвариант, чтобы он мог иметь не более одного отношения с каждым (своего рода) T-узлом. Вы делаете это с помощью x_node.getSingleRelationship (THE_T_TYPE_YOURE_MUTATING), если это возвращает нуль, безопасно добавить новое отношение этого типа, если оно возвращает отношение, вам придется удалить его, прежде чем вы сможете добавить новое.

ASCII-арт пример этой модели (насколько я понимаю):

(x1)--T_ONE-->(t1a)   (t1b)<--T_ONE--(x2)--T_FOUR-->(t4a)
 |\                                   |
 \ |---T_TWO-->(t2a)                 /
  \                                 /
   |---T_THREE-->(t3a)<--T_THREE---/

В приведенном выше примере оба узла X являются частью компонентов T_ONE, но x1 является частью компонента T_ONE t1a, а x2 является частью t1b. Они оба являются частью компонента T_THREE t3a, тогда x1 является частью компонента T_TWO t2a, а x2 является частью компонента T_FOUR t4a. Запрос в этом примере будет выглядеть примерно так:

Iterable<Relationship> x1_comps = x1.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);
Iterable<Relationship> x2_comps = x2.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);

И обновление будет выглядеть так:

void setComponent(Node xNode, RelationshipType tType, Node tNode) {
    Relationship current = xNode.getSingleRelationship(tType);
    if (current != null) current.delete();
    xNode.createRelationshipTo(tNode, tType);
}

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

0 голосов
/ 12 марта 2010

Что касается другого запроса, я указал на некоторые возможности для мелкозернистых функций на Как я могу указать, какой тип отношений использовать в качестве функции текущего узла на каждом шаге обхода с neo4j? По сути, не используйте traverser, а более прямой API node.getRelationship * и создайте свою собственную итерацию для точного контроля.

Решает ли это вашу проблему?

/ Питер Нойбауэр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...