Cypher推荐查询性能

时间:2016-01-25 18:21:48

标签: performance neo4j cypher r-neo4j

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

1 个答案:

答案 0 :(得分:1)

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

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