监控neo4j查询结果的实时更改?

时间:2015-10-22 17:21:55

标签: neo4j cypher graph-databases

我有来自MMO的玩家互动的传入事件流。我想构建一个玩家即时交互的图表,持续运行过去~30-240秒的活动查询,并实时更新图形视图。

关于我的具体案例的更多细节:

  • 我每秒有大约100-500个传入事件。这些看起来像:

    (PlayerA) - > [:TAKES_ACTION] - GT;(比赛) - > [:RECIPIENT] - GT;(PlayerB)

每个事件都带有时间戳。时间戳精确到秒。我计划将每个事件附加到表示时间戳的节点,因此我可以将查询限制为附加到一组X个最新时间戳的事件。

  • 我希望在任何给定的时间范围内,有大约1000-2000名活跃玩家。

  • 我的疑问将是根据相互作用将玩家聚集在一起,以确定哪些团体目前正在与其他团体进行战斗。

我的主要问题是:

  • Neo4j是否具有任何类型的“增量更新”功能,无需为每组更改重新运行整个查询,从而有效地更新查询结果?

  • Neo4j是否有能力将查询结果的任何更改“推送”到客户端?或者客户是否必须不断轮询数据库?

  • 是否有任何优化或技巧可以使连续重复的查询尽可能高效?

1 个答案:

答案 0 :(得分:2)

答案

1)否。您只能执行查询并获得结果。

2)否。目前您只能制作客户 - >服务器请求。

3)是的。

详细

让我们来看看这一个的底部。 Neo4j默认可以为您提供:

  • REST API
  • Transactional Cypher ednpoint
  • 遍历端点
  • 自定义插件
  • 自定义非托管扩展程序

在您的情况下,您应该实施unmanaged extension。这是获得所需功能的最佳选择 - 自己开发。

有关扩展程序的更多信息:

在扩展程序中,您可以执行所有

  • 使用核心API 对最新数据进行有效查询
  • 为客户端和服务器之间的全双工通信通道创建WebSocket端点
  • 实施任何其他逻辑以正确格式化/表示您的数据

查询和表现

Cypher查询在首次执行时进行编译和缓存。之后 - 使用缓存查询版本。查询执行本身非常快。

建议:

  • 始终在可能的地方使用查询参数。这允许Neo4j有效地重用查询
  • 在编写查询时要聪明。尝试尽可能降低基数。
  • 考虑数据模型。当查询总是只获取最新数据时,您可以以这种方式建模数据。在您的情况下,关系:LAST_EVENT:PREVIOUS_EVENT等可能有所帮助。