【发布时间】:2016-02-12 13:01:32
【问题描述】:
我是一家提供约会服务的公司的服务器工程师。 目前我正在为我们的新推荐引擎构建一个 PoC。 我尝试使用neo4j。但是这个数据库的性能并不能满足我们的需要。 我有强烈的感觉,我做错了什么,neo4j 可以做得更好。 那么有人可以给我一个建议如何提高我的 Cypher 查询的性能或如何以正确的方式调整 neo4j? 我正在使用在带有 Amazon Linux 的 c4.4xlarge 实例上运行的 neo4j-enterprise-2.3.1。 在我们的数据集中,每个用户可以与其他用户有 4 种类型的关系 - LIKE、DISLIKE、BLOCK 和 MATCH。 他还有一个属性,比如国家代码、生日和性别。
我使用 neo4j-import 工具将我们所有的用户和关系从 RDBMS 导入到 neo4j。 所以每个用户都是一个有属性的节点,每个引用都是一个关系。
neo4j-import 工具的报告说:
2 558 667 个节点,
1 674 714 539属性和
1 664 532 288 关系
已导入。
所以这是一个巨大的数据库 :-) 在我们的例子中,一些节点可以有多达 30 000 个传出关系..
我在 neo4j 中做了 3 个索引:
Indexes
ON :User(userId) ONLINE
ON :User(countryCode) ONLINE
ON :User(birthday) ONLINE
然后我尝试使用此查询构建在线推荐引擎:
MATCH (me:User {userId: {source_user_id} })-[:LIKE | :MATCH]->()<-[:LIKE | :MATCH]-(similar:User)
USING INDEX me:User(userId)
USING INDEX similar:User(birthday)
WHERE similar.birthday >= {target_age_gte} AND
similar.birthday <= {target_age_lte} AND
similar.countryCode = {target_country_code} AND
similar.gender = {source_gender}
WITH similar, count(*) as weight ORDER BY weight DESC
SKIP {skip_similar_person} LIMIT {limit_similar_person}
MATCH (similar)-[:LIKE | :MATCH]-(recommendation:User)
WITH recommendation, count(*) as sheWeight
WHERE recommendation.birthday >= {recommendation_age_gte} AND
recommendation.birthday <= {recommendation_age_lte} AND
recommendation.gender= {target_gender}
WITH recommendation, sheWeight ORDER BY sheWeight DESC
SKIP {skip_person} LIMIT {limit_person}
MATCH (me:User {userId: {source_user_id} })
WHERE NOT ((me)--(recommendation))
RETURN recommendation
这是其中一位用户的执行计划: plan
当我对用户列表执行此查询时,我得到了结果:
count=2391, min=4565.128849, max=36257.170065, mean=13556.750555555178, stddev=2250.149335254768, median=13405.409811, p75=15361.353029999998, p95=17385.136478, p98=18040.900481, p99=18426.811424, p999=19506.149138, mean_rate=0.9957385490980866, m1=1.2148195797996817, m5=1.1418078036067119, m15=0.9928564378521962, rate_unit=events/second, duration_unit=milliseconds
因此,对于实时推荐来说,即使是最快的速度也太慢了..
你能告诉我我做错了什么吗?
谢谢。
【问题讨论】:
-
你能上传扩展框的计划吗?
-
上传的扩展方案
-
嗨,迈克,你能给我发一封电子邮件吗,neo4j.com 的迈克尔,很想访问你的数据库来帮助你进行查询。