Neo4j - получить определенные узлы и отношения - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть приложение, в котором отображаются узлы и отношения. После того, как результат показан, узлы и отношения могут быть добавлены через графический интерфейс. Когда пользователь закончил, я хотел бы снова получить все данные из базы данных (потому что у меня нет всех данных к этому моменту во внешнем интерфейсе) на основе идентификатора Neo4j всех узлов и ссылок. Сложность для меня заключается в том, что существуют «плавающие» узлы, которые не имеют отношения в результате графического интерфейса (они будут иметь отношения в базе данных, но я не хочу их). Стоит отметить, что в моих отношениях у меня есть идентификатор начального и конечного узла. Я думал начать с этого, но у меня нет этих плавающих узлов. Давайте посмотрим на этот плохо нарисованный пример изображения: Poorly drawn example

Как видите:

  • узел 1 связан (без направления) с узлом 2.
  • узел 2 связан с узлом 3 (от 2 до 3)
  • узел 3 связан с узлом 4 (от 3 до 4)
  • узел 3 также связан с узлом 5 (без направления)
  • узел 6 - это плавающий узел, без отношений

Предположим, что:

  • id (отношение между 1 и 2) = 11
  • id (отношение между 2 и 3) = 12
  • id (отношение между 3 и 4) = 13
  • id (отношение между 3 и 5) = 14

Принимая во внимание, что за реальными данными существует гораздо больше связей между всеми этими узлами, как я могу заново создать это самое изображение через Neo4j? Я пытался сделать что-то вроде:

match path=(n)-[rels*]-(m)
where id(n) in [1, 2, 3, 4, 5]
and all(rel in rels where id in [11, 12, 13, 14])
and id(m) in [1, 2, 3, 4, 5]
return path

Однако это не работает должным образом по нескольким причинам. Кроме того, просто сопоставление на всех узлах не дает мне отношения. Нужно ли объединять несколько запросов? Можно ли это сделать за 1 запрос? Мне нужно написать свой собственный плагин?

Я использую Neo4j 3.3.5.

1 Ответ

1 голос
/ 25 апреля 2019

Вам не нужно вести список идентификаторов узлов.Каждое отношение указывает на его 2 конечных узла.Поскольку вам всегда нужны оба конечных узла, вы получаете их бесплатно, используя только список идентификаторов отношений.

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

MATCH p=()-[r]-()
WHERE ID(r) IN [11, 12, 13, 14]
RETURN p

Кстати, все отношения neo4j имеют направление.Вы можете не указывать направление при создании (используя MERGE) и / или запросить его, но оно все еще имеет направление.А визуализация браузера neo4j всегда будет показывать направление.

[ОБНОВЛЕНО]

Если вы также хотите включить «плавающие» узлы, которые не привязаны к связи в вашем списке отношенийтогда вы можете просто использовать отдельный список идентификаторов плавающих узловНапример:

MATCH p=()-[r]-()
WHERE ID(r) IN [11, 12, 13, 14]
RETURN p
UNION
MATCH p=(n)
WHERE ID(n) IN [6]
RETURN p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...