我正在使用rNeo4j作为推荐应用程序,我在编写高效查询时遇到了一些问题。查询的目标是向用户推荐一个项目,并规定他们之前没有使用过该项目。
我想返回项目的名称,路径上的节点(用于建议的可视化),以及一些其他措施,以使建议尽可能相关。目前我正在返回之前使用过该项目的用户数量,推荐路径的长度以及qCount关系属性的总和。
当前查询:
MATCH (subject:User {id: {idQ}), (rec:Item),
p = shortestPath((subject)-[*]-(rec))
WHERE NOT (subject)-[:ACCESSED]->(rec)
MATCH (users:User)-[:ACCESSED]->(rec)
RETURN rec.Name as Item,
count(users) as popularity,
length(p) as pathLength,
reduce(weight = 0, q IN relationships(p)| weight + toInt(q.qCount)) as Strength,
nodes(p) as path
ORDER BY pathLength, Strength DESCENDING, popularity DESCENDING
LIMIT {resultLimit}
查询似乎工作正常,但所需的应用程序(大约8秒)需要很长时间。有没有人对如何提高查询性能有一些建议?
我是cypher的新手,所以如果对于更高级的用户来说这是显而易见的话我会道歉。
答案 0 :(得分:1)
要考虑的一件事是在可变长度路径模式上指定上限,如下所示:p = shortestPath((subject)-[*2..5]->(rec))
这会将模式中的关系数限制为最大值5.不设置最大性能可能很差,考虑所有长度的路径。
要考虑的另一件事是:通过在路径中的所有节点上对关系属性qCount
求和,然后按此总和进行排序,您将寻找最短的加权路径。 Neo4j包含一些图形算法(例如Dijkstra),用于有效地找到这些路径,但它们不是通过Cypher公开的。有关详细信息,请参阅this page。