как агрегировать и сортировать по одному и тому же свойству отношений - PullRequest
0 голосов
/ 16 мая 2019

Я очень новичок в 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"]}]                            │
└─────┴─────────────┴──────────────────────────────────────────────────────────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...