【问题标题】:Keeping track of visits on a certain resource in neo4j在 neo4j 中跟踪对某个资源的访问
【发布时间】:2015-12-16 17:13:57
【问题描述】:

我想跟踪用户对各种资源页面的访问。

我保留这些信息以查询浏览次数最多的页面、建议类似的主题等等。

我想到了三种可能的设计。

第一个:在用户访问页面时,在用户和资源之间创建一个“已访问”类型的新关系。

MATCH (u:User), (r:Resource)
WHERE some conditions
create (u)-[:visited]->d

第二个:创建具有count 属性的唯一关系,并在您有新访问时随时更新。

第三个:创建一个Visit类型的节点来保存所有访问信息,并更新它。

(第三篇受本文启发:http://snowplowanalytics.com/blog/2014/07/31/using-graph-databases-to-perform-pathing-analysis-initial-experimentation-with-neo4j/

由于我对 neo4j 还很陌生,所以我无法确定哪一个在性能方面是最好的。你能帮帮我吗?

【问题讨论】:

  • 这也取决于您要对数据执行的查询。以及您期望的访问次数。如果它增长到数千,我不会寻求个人关系。

标签: database-design neo4j


【解决方案1】:

Martin 是对的,这取决于您在做什么。我实际上在我最近调用GraphStarter 的Ruby on Rails 引擎gem 中解决了这个问题。该 gem 的目标是为您的数据提供 Web UI。此外,它记录 Rails 会话(注销或登录)并将这些会话与用户相关联,并将会话与单个资产相关联。我最终做的是在每个会话和每个资产之间建立一个关系,如果它不存在则合并它,如果它存在则增加一个计数器。您可以在此处查看代码:

https://github.com/neo4j-examples/graph_starter/blob/master/app/controllers/graph_starter/assets_controller.rb#L52

https://github.com/neo4j-examples/graph_starter/blob/master/app/models/graph_starter/view.rb#L34

如果我想按用户计算资产的观看次数,我可以这样做:

MATCH (asset:Asset)<-[view:VIEWED]-(:Session)-[:FOR_USER]->(user:User)
WITH asset, user, sum(view.count) AS view_count
RETURN asset.title, user.username, view_count

当然,这是因为随着时间的推移,用户可能会拥有多个会话。另外,我通过assetuser 执行WITH 而不是简单地RETURNing,因为我不想按资产的标题/用户的用户名分组,以防有多个资产具有相同的标题/多个用户使用相同的用户名。

最后一点,如果您决定像我一样使用中间 Session 节点:出于安全原因,Rails 会在您登录/注销时为您创建一个新会话。因此,我还创建了一个REPLACES 关系来显示我们认识的会话链。这意味着我们可以通过注销会话将用户绑定到资产视图,如下所示:

MATCH (asset:Asset)<-[view:VIEWED]-(:Session)-[:FOR_USER|REPLACES*]->(user:User)
WITH asset, user, sum(view.count) AS view_count
RETURN asset.title, user.username, view_count

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多