Cypher: рекомендуемые статьи для врачей, использующие общие связи между узлами - PullRequest
0 голосов
/ 01 марта 2019

Вариант использования

Мое приложение должно отправлять статьи пользователям (врачам) на основе их профиля и действий пользователя.В следующем примере рассмотрим (см. Также график ниже):

  • Два Доктора (один Профессия: Доктор, Специальность: Онкология, другой Доктор, Специальность: неизвестно)
  • Статья была вручную связана с Профессия: Доктор, Специальность: Онкология и Ключевое слово: Хирургия коленного сустава (т. Е. Показать эту статью пользователям, соответствующим этому профилю.).

Внешний интерфейс отправляет пользователяидентификатор бэкэнда, и бэкэнд должен отвечать n статьями, которые соответствуют профилю пользователя.

enter image description here

Вопрос

То, что запрос шифрования Neo4j будет в основном переводить в MATCH (a:Article)..., учитывая профиль пользователя.Или иначе сказал найти (a: Article) [....], который имеет сходные отношения с узлами Profession, Keyword и Specialty, которые пользователь имеет .

Какая форма может и должна бытьзапрос шифра выглядит как?

1 Ответ

0 голосов
/ 04 марта 2019

TL; DR

Вот начало:

MATCH p=(u:User {id: $theID})-[:r]->()<-[:m]-(a:Article)
WITH a, COUNT(p) as rank
RETURN a.name, rank
ORDER BY rank DESC
LIMIT $n

Идея в том, чтобы просто подсчитать все пути от пользователя к каждой статье, а затем использоватьэто как звание.Чем больше путей, т. Е. Чем больше общих специальностей и ключевых слов, тем выше ранг.

Длинная версия ... Больше данных, проверка ранга

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

Чтобы иметь больше данных для игры, я создал несколько фальшивых докторов, статьи и т. д. Я почти уверен, что есть лучший способ сделать это.

MERGE (p:Profession {name: "Doctor"})
WITH p, ["Fred","Wilma","Pebbles","Dino","Barney","Betty","Bamm-bamm", "Hoppy"] as doctors
UNWIND doctors as doc
MERGE (d:User {name: doc})-[:R]->(p);

WITH ["Oncology", "Pathology","Pediatrics","ENT","Radiology","Dermatology"] as specialties
UNWIND specialties as spec
MERGE (:Specialty {name: spec});

MATCH (d:User)
WITH d, ["Oncology", "Pathology","Pediatrics","ENT","Radiology","Dermatology"] as specialties
UNWIND apoc.coll.randomItems(specialties, toInteger(apoc.text.random(1,"00111223"))) as docspec
MATCH (spec:Specialty {name: docspec})
MERGE (d)-[:R]->(spec);

WITH ["Knee Surgery","Ear Injury","Throat Cultures","Radial fractures", "Arm rash", "Mole color"] as keywords
UNWIND keywords as key
MERGE (:Keyword {name: key});

MATCH (d:User)
WITH d, ["Knee Surgery","Ear Injury","Throat Cultures","Radial fractures", "Arm rash", "Mole color"] as keywords
UNWIND apoc.coll.randomItems(keywords, toInteger(apoc.text.random(1,"01112233"))) as docword
MATCH (key:Keyword {name: docword})
MERGE (d)-[:R]->(key);

MATCH (p:Profession {name: "Doctor"})
WITH p, ["Useful article","Cool article","Awesome article","Research article","Nifty article","Health article"] as articles
UNWIND articles as art
MERGE (:Article {name: art})-[:M]->(p);

MATCH (art:Article)
WITH art, ["Oncology", "Pathology","Pediatrics","ENT","Radiology","Dermatology"] as specialties
UNWIND apoc.coll.randomItems(specialties, toInteger(apoc.text.random(1,"111223"))) as artspec
MATCH (spec:Specialty {name: artspec})
MERGE (art)-[:M]->(spec);

MATCH (art:Article)
WITH art, ["Knee Surgery","Ear Injury","Throat Cultures","Radial fractures", "Arm rash", "Mole color"] as keywords
UNWIND apoc.coll.randomItems(keywords, toInteger(apoc.text.random(1,"1112233"))) as artword
MATCH (key:Keyword {name: artword})
MERGE (art)-[:M]->(key);

Вот переплетенный беспорядок.

enter image description here

Теперь, глядя на одного «доктора»:

MATCH p=(u:User {name: "Barney"})-[:R]->()<-[:M]-(a:Article)
RETURN p

... вы можете увидеть все статьи, к которым он подключен.

enter image description here

Итак, давайте оценим их по количеству подключений к врачу.

MATCH p=(u:User {name: "Barney"})-[:R]->()<-[:M]-(a:Article)
WITH a, COUNT(p) as rank
RETURN a.name, rank
ORDER BY rank DESC

enter image description here

Dr.Барни, вероятно, заинтересует «Отличная статья».

Существует множество способов ранжирования, это простой способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...