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。
我正在使用 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。