2014-12-10 49 views
0

的路径自动加载我有大量的是由谁访问网站的用户的数据。每次访问都有时间戳。使用http://jexp.de/blog/2012/10/parallel-batch-inserter-with-neo4j/剧本,我创建了针对每个页面的Neo4j和Groovy:可变长度

U1-->T1-->P1 
| 
--->T2-->P2 
etc. 

一个单独的路径现在的图形,我想有以下结构:

U1-> T1-> P1-> T2- > P2 ......

显然,每个用户访问不同的页数。我有一个看起来像这样的文件:

person,time,place 
U1,t1,P1 
U1,t2,P2 
U1,t3,P3 
U2,t4,P1 
U2,t5,P6 

每个用户序列由访问时间排序,所以t1about我 - >博客等

  1. 是上述结构U1-> T1-> P1 - > T2-> P2一个好的方法? (我有大约30万个条目)
  2. 我需要修改的常规脚本,以便它可以自动在同一序列中添加关系和节点。我正在考虑保留以前的用户ID在内存中,如果新的用户ID =旧ID,那么我只会添加关系和地点。否则,我将创建一个新用户并构建新路径。

回答

3

我假设你的节点被标记为U为用户,为T时间戳和P的页面。

  1. 您不需要时间戳节点。您可以将时间戳值放在UP之间的关系中。这将大大减少节点和关系的数量。

    例如,而不是这个(我弥补的关系 类型):

    (:U)-[:VISITED_AT]->(:T {timestamp: 123})-[:PAGE]->(:P) 
    

    你可以利用这一点,这样可以节省1个节点和每次访问1间的关系:

    (:U)-[:VISITED {timestamp: 123}]->(:P) 
    
  2. 您描述的看起来很合理,但是您可以为同一页面创建多个节点(例如,示例文件中的P1,因为它出现了两次),而您确实希望每页都有一个节点。另外,如果文件在U2行之后包含另一个U1行,则会创建第二个U1节点。为了防止这样的重复,你应该使用MERGE而不是CREATEUP节点。 MERGE只有在不存在的情况下才会创建节点,否则它只返回现有的节点。一旦拥有节点,您就可以继续并将它们之间的关系(以时间戳作为属性)关联在一起。

+0

对不起,我忘了提及,我已经有用户和页面的唯一性约束。 – user201411 2014-12-11 07:01:50