我希望在各种资源页面上跟踪用户的访问情况。
我保留此信息以查询大多数查看过的网页,提出类似主题等建议。
我想到了三种可能的设计。
第一个:在用户访问该页面时,在用户和资源之间创建一个“已访问”类型的新关系。
MATCH (u:User), (r:Resource)
WHERE some conditions
create (u)-[:visited]->d
第二个:使用count
属性创建唯一关系,并在您新访问时随时更新。
第三个:创建一个Visit
类型的节点,该节点保留有关访问的所有信息,并进行更新。
由于我对neo4j很新,我无法确定哪个是最好的表演。你能救我吗?
答案 0 :(得分:1)
马丁是对的,这取决于你做了什么。我最近在Ruby on Rails引擎gem中解决了这个问题,我最近调用了GraphStarter。该gem的目标是为您的数据提供Web UI。此外,它记录Rails会话(登出或登录)并将其与用户相关联,并将会话与各个资产相关联。我最终做的是每个会话和每个资产之间有一个关系,如果它不存在则合并它,如果它存在则增加一个计数器。你可以在这里看到代码:
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
当然,这是因为用户可能会有多个会话。此外,我按WITH
和asset
执行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