Создание вашего графика:
Первый оператор создает узлы, второй - отношения между ними.
CREATE
(Root:Category {name: 'Letters'}),
(KeywordA:KeyWord {name: 'A'}),
(KeywordAA:KeyWord {name: 'A A'}),
(KeywordAB:KeyWord {name: 'A B'}),
(KeywordAC:KeyWord {name: 'A C'}),
(KeywordC:KeyWord {name: 'C'}),
(KeywordCA:KeyWord {name: 'C A'}),
(KeywordCB:KeyWord {name: 'C B'}),
(KeywordD:KeyWord {name: 'D'}),
(KeywordDA:KeyWord {name: 'D A'}),
(KeywordB:KeyWord {name: 'B'}),
(KeywordBA:KeyWord {name: 'B A'}),
(KeywordBAA:KeyWord {name: 'B A A'}),
(KeywordBAB:KeyWord {name: 'B A B'}),
(KeywordBAC:KeyWord {name: 'B A C'}),
(KeywordBB:KeyWord {name: 'B B'}),
(KeywordBBA1:KeyWord {name: 'B B A'}),
(KeywordBBA2:KeyWord {name: 'B B A'}),
(KeywordBBA3:KeyWord {name: 'B B A'}),
(KeywordBBA4:KeyWord {name: 'B B A'}),
(KeywordBBA5:KeyWord {name: 'B B A'}),
(Content18:Content {name: '18'}),
(Content19A:Content {name: '19'}),
(Content19B:Content {name: '19'}),
(Content20:Content {name: '20'}),
(Content1:Content {name: '1'}),
(Content2:Content {name: '2'}),
(Content3A:Content {name: '3'}),
(Content3B:Content {name: '3'}),
(Content4:Content {name: '4'}),
(Content5:Content {name: '5'})
CREATE
(Root)-[:CONTAINS]->(KeywordA),
(KeywordA)-[:CONTAINS]->(KeywordAA),
(KeywordA)-[:CONTAINS]->(KeywordAB),
(KeywordA)-[:CONTAINS]->(KeywordAC),
(Root)-[:CONTAINS]->(KeywordC),
(KeywordC)-[:CONTAINS]->(KeywordCA),
(KeywordC)-[:CONTAINS]->(KeywordCB),
(Root)-[:CONTAINS]->(KeywordD),
(KeywordD)-[:CONTAINS]->(KeywordDA),
(Root)-[:CONTAINS]->(KeywordB),
(KeywordB)-[:CONTAINS]->(KeywordBA),
(KeywordBA)-[:CONTAINS]->(KeywordBAA),
(KeywordBA)-[:CONTAINS]->(KeywordBAB),
(KeywordBA)-[:CONTAINS]->(KeywordBAC),
(KeywordB)-[:CONTAINS]->(KeywordBB),
(KeywordBB)-[:CONTAINS]->(KeywordBBA1),
(KeywordBB)-[:CONTAINS]->(KeywordBBA2),
(KeywordBB)-[:CONTAINS]->(KeywordBBA3),
(KeywordBBA2)-[:CONTAINS]->(KeywordBBA4),
(KeywordBBA2)-[:CONTAINS]->(KeywordBBA5),
(KeywordCB)-[:DESCRIBES]->(Content18),
(KeywordDA)-[:DESCRIBES]->(Content19B),
(KeywordBAA)-[:DESCRIBES]->(Content19A),
(KeywordBAA)-[:DESCRIBES]->(Content1),
(KeywordBAB)-[:DESCRIBES]->(Content20),
(KeywordBB)-[:DESCRIBES]->(Content1),
(KeywordBB)-[:DESCRIBES]->(Content2),
(KeywordBB)-[:DESCRIBES]->(Content3A),
(KeywordBBA1)-[:DESCRIBES]->(Content4),
(KeywordBBA1)-[:DESCRIBES]->(Content5),
(KeywordBBA4)-[:DESCRIBES]->(Content5),
(KeywordBBA5)-[:DESCRIBES]->(Content3B);
Графическое представление.
Выбор подграфа:
- определение вашей отправной точки, категория
- любое количество ключевых слов до достижения выбранного вами ключевого слова
- определение выбранного вами ключевого слова
- любое количество ключевых слов до достижения узла контента
- передать параметр (id) для выбранного ключевого слова
- восстановить все идентифицированные узлы с шага 1 до 5
Заявление:
// |----------- (1) -----------| |--- (2) --| |--------- (3) ---------| |--------- (4) --------|
MATCH keywordPath = (:Category {name: 'Letters'})-[:CONTAINS*]->(selectedKeyword:KeyWord)-[:CONTAINS*]->(:KeyWord)
// |-------- (5) ---------|
WHERE id(selectedKeyword) = 15
UNWIND
// |------------ (6) -----------|
nodes(keywordPath) AS keywordNode
MATCH contentPath = (keywordNode:KeyWord)-[contentRelationship:DESCRIBES]->(contentNode:Content)
RETURN keywordPath,contentPath;
Ваше желаемое решение:
Насколько я понял, вас интересуют отношения к узлам контента для отображения в соответствии с миниатюрами. Вы можете получить их с помощью следующего оператора Cypher:
MATCH keywordPath = (:Category {name: 'Letters'})-[:CONTAINS*]->(selectedKeyword:KeyWord)-[:CONTAINS*]->(:KeyWord)
WHERE id(selectedKeyword) = 15
UNWIND
nodes(keywordPath) AS keywordNode
MATCH contentPath = (keywordNode:KeyWord)-[contentRelationship:DESCRIBES]->(contentNode:Content)
RETURN contentPath;
Обновление: запрос количества ключевых слов, связанных с содержанием
Заявление:
MATCH keywordPath = (:Category {name: 'Letters'})-[:CONTAINS*]->(selectedKeyword:KeyWord)-[:CONTAINS*]->(:KeyWord)
WHERE id(selectedKeyword) = 15
UNWIND
nodes(keywordPath) AS keywordNode
WITH DISTINCT keywordNode
MATCH contentPath = (keywordNode:KeyWord)-[*]->(contentNode:Content)
RETURN keywordNode, count(DISTINCT contentNode);
Результат
╒════════════════╤═════════════════════════════╕
│"keywordNode" │"count(DISTINCT contentNode)"│
╞════════════════╪═════════════════════════════╡
│{"name":"B B A"}│2 │
├────────────────┼─────────────────────────────┤
│{"name":"B B A"}│1 │
├────────────────┼─────────────────────────────┤
│{"name":"B B A"}│2 │
├────────────────┼─────────────────────────────┤
│{"name":"B B A"}│1 │
├────────────────┼─────────────────────────────┤
│{"name":"B"} │8 │
├────────────────┼─────────────────────────────┤
│{"name":"B B"} │6 │
└────────────────┴─────────────────────────────┘