Я очень новичок в neo4j и хочу создать механизм рекомендаций для пользователей и проектов. Вот структура данных:
CREATE
(u1:User {id: 2, title: "symfony php", description:"php"})
CREATE (p:Project {id: 1, title: "php", description: "symfony"}),
(p1:Project {id: 4, title: "symfony php", description:"php"})
CREATE (t1:Tag { id: 1, name: "php"}),
(t2:Tag { id: 2, name: "symfony"})
CREATE (t2)-[:BORADER]->(t1)
CREATE
(u1)-[:TAGGED {position: "title"}]->(t2),
(u1)-[:TAGGED {position: "title"}]->(t1),
(u1)-[:TAGGED {position: "desc"}]->(t1),
(p)-[:TAGGED {position: "title"}]->(t1),
(p)-[:TAGGED {position: "desc"}]->(t2),
(p1)-[:TAGGED {position: "title"}]->(t2),
(p1)-[:TAGGED {position: "title"}]->(t1),
(p1)-[:TAGGED {position: "desc"}]->(t1)
Я хочу найти лучшие проекты, отсортированные по большинству отношений и упорядоченные поколичество совпадений заголовок и описание
Я пробовал много решений, и я думаю, что это лучший запрос на данный момент
MATCH (u:User)
WHERE u.id = 1
MATCH (u)-[ut:TAGGED]->(t:Tag)<-[pt:TAGGED]-(p:Project)
RETURN DISTINCT p.title, { position: ut.position, tags: collect(t.name), size: size(collect(t.name))} as data
ORDER by SIZE(data.size) desc
результат будет: https://ibb.co/MGVv0V7
проблема заключается в том, что проекты сгруппированы по позиции, но дублируются в результате для совпадений заголовка и описания, и я не знаю, как разрешить: отношения тегов BORADER между тегами
ожидаемый результатдолжен выглядеть так:
"php symfony" | { position: "title" , tags: ["php", "symfony"], size: 2}, { position: "desc", tags: ["symfony"], size: 1 }
"php" | { position: "title" , tags: ["php"], size: 1}, { position: "desc", tags: ["symfony"], size: 1 }
* Редактировать *
Я пробовал другие запросы, и теперь я близок к нужному результату
MATCH (u: User)-[ut:TAGGED]->(t:Tag)<-[pt:TAGGED]-(p:Project)
WHERE u.id = 2
WITH p.id as pid,
{position: ut.position, tags: collect(t.name)} as data,
p.title as title
WITH pid, title, collect({position: data.position, tags: data.tags, size: size (data.tags)}) as data
RETURN pid, title, data
ORDER BY data[0].size, data[1].size desc
, но в этом запросе у меня дублируются узлы в моем результате:
╒═════╤═════════════╤══════════════════════════════════════════════════════════════════════╕
│"pid"│"title" │"data" │
╞═════╪═════════════╪══════════════════════════════════════════════════════════════════════╡
│1 │"php" │[{"size":1,"position":"desc","tags":["php"]},{"size":2,"position":"tit│
│ │ │le","tags":["php","symfony"]}] │
├─────┼─────────────┼──────────────────────────────────────────────────────────────────────┤
│4 │"symfony php"│[{"size":2,"position":"desc","tags":["php","php"]},{"size":3,"position│
│ │ │":"title","tags":["php","php","symfony"]}] │
└─────┴─────────────┴──────────────────────────────────────────────────────────────────────┘