Cypher推荐查询性能

Cypher recommendation query performance

我正在使用 rNeo4j 开发推荐应用程序,但在编写高效查询时遇到了一些问题。查询的目标是向用户推荐一个项目,条件是他们以前没有使用过该项目。

我想要 return 项目的名称、路径上的节点(用于推荐的可视化)以及一些额外的措施,以使推荐尽可能相关。目前我正在 returning 以前使用过该项目的用户数量、推荐路径的长度以及 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 的新手,所以如果这对更高级的用户来说是显而易见的,我深表歉意。

需要考虑的一件事是像这样指定可变长度路径模式的上限:p = shortestPath((subject)-[*2..5]->(rec))这将模式中的关系数量限制为最多 5 个。如果不设置最大性能,则可以差,因为考虑了所有长度的路径。

要考虑的另一件事:通过对路径中所有节点的关系 属性 qCount 求和,然后按此总和排序,您正在寻找最短的 weighted 路径。 Neo4j 包括一些图形算法(例如 Dijkstra)来有效地找到这些路径,但是它们不会通过 Cypher 公开。有关详细信息,请参阅 this page