Neo4j基于相似度按供应商按地区创建排名

问题描述

我可以使用用户没有购买的,使用相同(相似)的材料创建推荐并显示为推荐引擎

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

但无法使用第一查询和第二查询创建一个查询,无法按供应商的位置创建相似性相似的排名(如在第一查询中)。请提出建议。

我希望对按地区划分的供应商排名购买的类似材料提出建议

我要添加示例数据

enter image description here

,我的结果应该像它应该首先按照与供应商位置和供应商有关的材料购买次数的排名向我显示,即按卖出的desc,vlocation,供应商的ORDER BY。我得到了结果,但是排名与位置和供应商无关

我的预期结果应该是..让我们考虑enduserid = 104,然后结果应该像下面的scheenshot ..推荐的材料)(不包括已经购买的材料enduserid)由供应商订购,此处的销售地点是销售商从销售商地点出售的材料的次数最终用户ID

enter image description here

如果我们认为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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...