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);
Вот переплетенный беспорядок.
Теперь, глядя на одного «доктора»:
MATCH p=(u:User {name: "Barney"})-[:R]->()<-[:M]-(a:Article)
RETURN p
... вы можете увидеть все статьи, к которым он подключен.
Итак, давайте оценим их по количеству подключений к врачу.
MATCH p=(u:User {name: "Barney"})-[:R]->()<-[:M]-(a:Article)
WITH a, COUNT(p) as rank
RETURN a.name, rank
ORDER BY rank DESC
Dr.Барни, вероятно, заинтересует «Отличная статья».
Существует множество способов ранжирования, это простой способ.