1

我正在使用 neo4j 数据库来跟踪人与人之间的联系。我需要跟踪三阶连接(类似于linkedin 的做法),但我遇到了一些性能问题。在我的测试数据库中,我有大约 3000 个用户,有 3 到 8 个第一顺序连接(联系人)。在获取二阶连接时,性能似乎一切都很好。但是获取三阶连接需要很长时间。我使用 CYPHER 查询来获取数据。只有配置文件 ID 和它们之间的连接存储在数据库中。

这是查询本身:

THIRD_ORDER_CONNECTIONS = <<-CYPHER
  START n=node:profile(id='%{id}')
  MATCH n-[:contacts]-common_contact_1-[:contacts]-common_contact_2-[:contacts]-profile
  WHERE common_contact.id <> %{exclude_id} AND common_contact_1.id <> common_contact_2.id
  RETURN COLLECT(DISTINCT profile.id)
CYPHER

在我的本地机器上需要 48 秒。所以问题是 - 我如何提高性能或更改查询以在适当的时间获得三阶连接?

4

2 回答 2

1

您是否尝试过使用 neo4j 版本 1.9.M01?对于像这样的直截了当的模式,Cypher 的性能得到了改进,这可能会产生巨大的影响,它将更多的工作分担给遍历框架。

于 2012-12-04T22:23:43.707 回答
1

您的查询无效:common_contact.id无法解析为标识符

  • 你得到多少结果?
  • 如果您在查询中添加方向,查询时间会如何变化-->
  • 请使用参数而不是 ruby​​ 替换。
  • 尝试RETURN profile.id(不同需要将所有内容保存在内存中以进行唯一过滤)
  • 通常 cypher 负责唯一性,因此common_contact_1.id <> common_contact_2.id可能没有必要
于 2012-12-05T01:55:42.340 回答