Я работаю над описанием дерева структурированных данных в Neo4j. В моей текущей модели, узел может иметь п ссылки на другие узлы, что делает его дочерний узел из этих узлов:Как построить структуру дерева в Neo4j?
root
|
\-- A
|
\-- 1
|
\-- 2
- А ссылки на корень
- 1 и 2 Ссылка на
- корень родитель
- 1 и 2 являются дети A
Поскольку я использую nodejs (с node-neo4j), чтение базы данных ограничивается использованием Cypher. Для чтения узлов я использую следующий запрос:
START n=node(1)
-- this is the root node
MATCH (n)<-[linkedby:links*]-x, x-[linksto?:links*1]->()
-- get all nodes that link to the root node and all nodes linking to those nodes, etc, etc and retrieve all nodes those found nodes link to
RETURN n, x, linkedby, LAST(linkedby) AS parent, COLLECT(DISTINCT linksto) AS links
-- the last in the path of linkedby is the direct parent
ORDER BY length(linkedby), parent.rank?
-- ordering so that parents are fetched before their children from the result set
Моя проблема: этот запрос становится очень медленным (> 1 с), поскольку число узлов и отношений расти.
Есть ли лучший способ моделирования узлов и отношений? Мне нужны разные отношения между родительскими узлами и дочерними узлами? Или мне нужно каким-либо образом изменить запрос?
Спасибо за любые указатели!
1) Реальный мир проблема: Своеобразного бизнес-процесс инструмента, где услуги связаны с процессами, организациями, группой и т.д., чтобы предоставить информацию, которые требуются услуги, когда и кто, а также предоставление информации кто будет предоставлять эту услугу или несет ответственность.
Так, например:
служба S используется в способе P1 и P2:
P1 P2
| |
\---+-- S
Сервис S управляется командой T:
T
|
\-- S
Команда Т является частью организации O:
O
|
\-- T
Дерево:
root
|
|
+-- Processes
| |
| +-- P1
| | |
| | \-- S
| |
| \-- P2
| | |
| | \-- S
|
+-- Organisations
| |
| +-- O
| |
| \-- T
| |
| \-- S
2) Мои данные в console.neo4j.org:
CREATE
(r {name:'root'}),
(ps {name: 'Processes'})-[:links]->r,
(p1 {name: 'P1'})-[:links]->ps,
(p2 {name: 'P2'})-[:links]->ps,
(s {name: 'Service'})-[:links]->p1,
s-[:links]->p2,
(org {name: 'Organisations' })-[:links]->r,
(t {name: 'Team'})-[:links]->org,
s-[:links]->t
1. Можете ли вы представить реальную проблему мира, что вы пытаетесь решить. 2. Настройте свои данные в console.neo4j.org и share (кнопка сверху). –
интересный вопрос, жалость нет ответов или подсказки на некоторые примеры кода онлайн –
yep люди больше не отвечают на реальные вопросы: D просто тривиальные для репутации фермы. Я могу ответить на это немного. –