【发布时间】:2015-08-07 07:59:28
【问题描述】:
在我的 Neo4j 应用程序中,我有一个产品、产品特性和投票列表(具有双倍权重),每个产品都具有特定特性。
为了按特征列表的平均投票权重对产品列表进行排序,我需要执行一个复杂的运行时 Cypher 查询,该查询将计算每个产品特征列表的平均权重总和。
这是我当前的 Cypher 查询:
MATCH (parentP:Product)-[:CONTAINS]->(childP:Product)
WHERE id(parentP) = {productId}
WITH childP
OPTIONAL MATCH (p:Product)<-[:VOTED_FOR]-(v:Vote)-[:VOTED_ON]->(c:Characteristic)
WHERE id(p) = id(childP) AND id(c) IN {characteristicIds}
WITH childP, c, avg(v.weight) as weight
RETURN childP AS product, sum(weight) as weight
ORDER BY weight DESC
我知道 Neo4j 的图形遍历速度非常快,但对于聚合(求和、计数、平均等)却没有那么好。我的系统可以为每个产品的每个特征提供大量投票列表。
请帮助我对这种结构进行去规范化,以避免因大量投票而出现任何性能问题。
Brian 查询的 PROFILE 输出:
Cypher 版本:CYPHER 2.2,规划器:COST。 1482 毫秒内总共 374933 次 db 命中。
【问题讨论】:
-
也许您可以分享一个示例数据库来帮助我们执行查询?
-
我已经添加了示例数据库和查询
-
您希望查询运行多快?我在您的数据库上的第一次运行需要 2.1 秒,而在第一次查询之后需要大约 0.5 秒
-
这是一个小型示例数据库..真正的数据库要大得多..我想让这个模式/查询独立于投票列表大小的性能
标签: neo4j cypher spring-data-neo4j graph-databases