Как включить определенное количество отношений в запрос Cypher - PullRequest
0 голосов
/ 12 сентября 2018

Учитывая эту схему…

schema

… и этот набор данных выборки…

Sample data set

… как я могу написать запрос Cypher, который будет возвращать эти данные, включая количество ...

Desired Result

Подробнее

  • : Ключевые слова образуют направленное ациклическое дерево с: Категория в корне.
  • Каждый: Ключевое слово содержит 0 или более: элементы контента.
  • Несмотря на то, что у каждого ключевого слова есть только один родитель: ключевое слово (или категория:), ключевое слово Key: отношение содержимого многие-ко-многим.

требования к запросу

  • Я надеюсь сделать это одним запросом, основанным на знании только идентификатора для выбранного узла, показанного красным цветом: ?.
  • Счетчик показывает число различных узлов содержимого, прикрепленных к поддереву выбранного ключевого слова.См. 3-е вложение изображений для примера.
  • Запрос должен включать черный контент black, как показано, так как целью является отображение миниатюрных изображений всего контента непосредственно с тегами текущего выбора.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

ON HOLD Если я правильно понял ваш вопрос.
Этот запрос может помочь вам:

MATCH (n:Keyword {name:"B B"})-[*1..6]->(c:Content)
RETURN COUNT(DISTINCT c)

Вы можете изменить 1..6, но установить отношение к [*]является большой трудоемкой базой для схемы БД, лучше установить диапазон для обхода отношений.

0 голосов
/ 12 сентября 2018

Создание вашего графика:

Первый оператор создает узлы, второй - отношения между ними.

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);

Графическое представление.

Выбор подграфа:

  1. определение вашей отправной точки, категория
  2. любое количество ключевых слов до достижения выбранного вами ключевого слова
  3. определение выбранного вами ключевого слова
  4. любое количество ключевых слов до достижения узла контента
  5. передать параметр (id) для выбранного ключевого слова
  6. восстановить все идентифицированные узлы с шага 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                            │
└────────────────┴─────────────────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...