Как я могу сохранить такой график в neo4j для быстрого обхода?

StackOverflow https://stackoverflow.com/questions/2421959

  •  19-09-2019
  •  | 
  •  

Вопрос

Это граф, узлы которого существуют во многих связных компонентах одновременно, поскольку отношения узлов представляют собой набор групп ребер, так что одновременно может присутствовать только одно ребро в каждой группе ребер.Мне нужно найти все связанные компоненты, в которых существует узел.Как лучше всего сохранить этот граф в 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* и создайте собственную итерацию для детального управления.

Это решает вашу проблему?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top