Как я могу сохранить такой график в neo4j для быстрого обхода?
Вопрос
Это граф, узлы которого существуют во многих связных компонентах одновременно, поскольку отношения узлов представляют собой набор групп ребер, так что одновременно может присутствовать только одно ребро в каждой группе ребер.Мне нужно найти все связанные компоненты, в которых существует узел.Как лучше всего сохранить этот граф в 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
существует в:
СС1:
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
СС3:
x1 is related to: x3, x5, x7
СС4:
x1 is related to: x3, x6, x7
и т. д.
Я благодарен вам за помощь в этом.
Обновление2:
Я думаю, что смогу это сделать, если есть ответ на этот вопрос:Как я могу указать, какой тип связи использовать в зависимости от текущего узла на каждом этапе обхода с помощью neo4j?
Решение
Насколько я понимаю ваш вопрос, у вас есть несколько узлов, назовем их X узлов, которые подключены к нескольким узлам типа (или чему-то подобному), назовем эти узлы Т-узлы.Узел X может иметь соединения с несколькими узлами T, но только одно соединение с каждым узлом T или, возможно, только одно соединение с каждым. добрый узла Т (ваше описание здесь немного размыто).
Я бы смоделировал это, используя один RelationshipType для каждого (вида) узла T.Затем вы можете использовать x_node.getRelationships(T_TYPE_ONE, T_TYPE_TWO, ...etc...), чтобы получить все узлы 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 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);
}
Сообщите мне, если я неправильно истолковал ваши требования, и я буду рад дать вам обновленное описание.
Другие советы
Что касается другого запроса, я указал на некоторые возможности для мелкозернистых функций на странице Как я могу указать, какой тип связи использовать в зависимости от текущего узла на каждом этапе обхода с помощью neo4j?По сути, не используйте траверс, а используйте более прямой API-интерфейс node.getRelationship* и создайте собственную итерацию для детального управления.
Это решает вашу проблему?
/Питер Нойбауэр