跟踪neo4j中某个资源的访问情况

时间:2015-12-16 17:13:58

标签: database-design neo4j

我希望在各种资源页面上跟踪用户的访问情况。

我保留此信息以查询大多数查看过的网页,提出类似主题等建议。

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

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

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很新,我无法确定哪个是最好的表演。你能救我吗?

1 个答案:

答案 0 :(得分:1)

马丁是对的,这取决于你做了什么。我最近在Ruby on Rails引擎gem中解决了这个问题,我最近调用了GraphStarter。该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

当然,这是因为用户可能会有多个会话。此外,我按WITHasset执行user而不是RETURN,因为我不想按资产的标题进行分组/ user的用户名,以防有多个资产具有相同的标题/多个用户具有相同的用户名。

最后一点,如果您决定像我一样使用中间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