I got a bipartite graph of user(~300K)-item(~300K) ratings :
:START_ID(User) | :END_ID(Item) | rating:INT |
---|---|---|
1234 | 8765 | 1 |
66 | 88 | 5 |
… | … | … |
which can be represent as a csr matrix of real number R
and it’s boolean version B
& C
.
And I try to get items similar to a specific item by querying
MATCH (:Item {id: 6})<-[:RATE]-(u:User)-[:RATE]->(i:Item)
RETURN i.id, count(u) AS similarity
// referece
// stackoverflow.com/questions/29066274/count-duplicated
gives the same answer as . (but is it done like this?)
Q1:
How about or ?
How to apply matrix multiplication (float) with more explicit query?
Just like
MATCH (o:Item {id: 6})<-[]-(:User)-[]->(:Item)<-[]-(:User)-[]->(i:Item)
RETURN o, i // [,count(*)]
// referece
// www.slideshare.net/RedisLabs/redisconf18-lower-latency-graph-queries-in-cypher-with-redis-graph
does the chain matrix multiplication of boolean matrices .
Q2:
I expect following query was done by , where R'
is R
with case when replacement.
But query is slow when the item is rated by many user, and all GRAPH.EXPLAIN can tell me is “aggregate”.
MATCH (:Item {id: 6})<-[:RATE]-(:User)-[r:RATE]->(i:Item)
RETURN
i.id,
SUM(CASE r.rating
WHEN 1 THEN 2
...
END)
and another try
MATCH (:Item {id: 6})<-[:RATE]-(us:User)
WITH distinct(us) as u, count(*) as cnt
MATCH (u)-[r:RATE]->(i:Item)
RETURN
i.id,
SUM(cnt*
(CASE r.rating
...
END)
)