问题描述
我可以使用用户没有购买的,使用相同(相似)的材料创建推荐并显示为推荐引擎
MATCH (eid:eid{id:'102'})-[:BOUGHT]->(mat:material)<-[:BOUGHT]-(someOthereid:eid)-[:BOUGHT]->(m2:material)
WHERE
NOT((eid)-[:BOUGHT]->(m2))
AND eid <> someOthereid
RETURN distinct m2,eid
以及基于供应商位置的基于推荐的排名,不论是否相似(建议所有材料(不包括自己的))
match (n:bookdb)
match (m:material{id:n.mat}) match(eid:eid{id:'104'}) match(ecl:ecountry{id:n.eloc})
match(ven:vendor{id:n.ven}) match(vloc:vlocation{id:n.vloc})
WHERE NOT (m)<-[:BOUGHT]-(eid)
with distinct eid,m,count(m) as timessold,ven,vloc
return distinct eid,timessold,vloc order by timessold desc,m
但无法使用第一查询和第二查询创建一个查询,无法按供应商的位置创建相似性相似的排名(如在第一查询中)。请提出建议。
我希望对按地区划分的供应商排名购买的类似材料提出建议
我要添加示例数据
,我的结果应该像它应该首先按照与供应商位置和供应商有关的材料购买次数的排名向我显示,即按卖出的desc,vlocation,供应商的ORDER BY。我得到了结果,但是排名与位置和供应商无关
我的预期结果应该是..让我们考虑enduserid = 104,然后结果应该像下面的scheenshot ..推荐的材料)(不包括已经购买的材料enduserid)由供应商订购,此处的销售地点是销售商从销售商地点出售的材料的次数最终用户ID
如果我们认为enduserid = 106,则由于没有共同的材料,因此不建议使用任何材料
解决方法
您可以使用UNION
语句来合并两个查询的结果。您必须小心,两个查询都返回相同的列。您还可以进行UNION后处理。这是来自documentation的示例:
MATCH (m:Movie {title:'The Matrix'})
CALL {
WITH m
MATCH (m)<-[:ACTED_IN]-(p)
RETURN p
UNION
WITH m
MATCH (m)<-[:DIRECTED]-(p)
RETURN p
}
RETURN p.name as name
ORDER BY name ASC
此语法仅在Neo4j 4.0及更高版本中有效。
,这可能对您有用:
MATCH (eid:eid)-[:BOUGHT]->(:material)<-[:BOUGHT]-(otherEid:eid)
WHERE eid.id = '104' AND eid <> otherEid
WITH DISTINCT eid,otherEid
MATCH (otherEid)-[:BOUGHT]->(m:material)
WHERE NOT (eid)-[:BOUGHT]->(m)
WITH eid,m,COUNT(*) AS timessold
MATCH (n:bookdb),(ecl:ecountry),(ven:vendor),(vloc:vlocation)
WHERE n.mat = m.id AND ecl.id = n.eloc AND ven.id = n.ven AND vloc.id = n.vloc
RETURN eid,timessold,ecl,ven,vloc
ORDER BY timessold DESC,m