2010-03-11 3 views
1

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

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

Update:

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

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 

СС2:

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

CC3:

x1 is related to: x3, x5, x7 

CC4:

x1 is related to: x3, x6, x7 

т.д.

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

Update2:

Я думаю, что я смогу это сделать, если есть ответ на этот вопрос: How can I specify which relationship type to use as a function of the current node at every step of a traversal with neo4j?

ответ

1

Они, как я понимаю ваш вопрос у вас есть несколько узлов, давайте назовите их X узлы, которые подключены к нескольким узлам типа (или что-то подобное), назовем эти узлы T узлами. У узла 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), если это возвращает null, можно добавить новое отношение этого типа, если оно вернет отношения, вам придется удалить его, прежде чем вы сможете добавить новый.

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 компоненты Т1а и х2 является частью от 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

Я обновил описание для наглядности. Спасибо! – James

+0

Я думаю, что решение, которое я предложил, по-прежнему действует с обновленным описанием проблемы. – thobe

0

Что касается другого вопроса, я отметил некоторые возможности для мелкозернистых функций на How can I specify which relationship type to use as a function of the current node at every step of a traversal with neo4j? В основном, не использую, но и транспортер более прямого node.getRelationship * API и создать свою собственную итерацию для мелкозернистого контроля.

Это решение проблемы?

/peter neubauer

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

  • Нет связанных вопросов^_^