0

我正在使用 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 的新手,所以如果这对更高级的用户来说是显而易见的,我深表歉意。

4

1 回答 1

1

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

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

于 2016-01-25T19:23:49.790 回答