【问题标题】:neo4j and groovy: automatic loading of paths of variable lengthneo4j 和 groovy:自动加载可变长度的路径
【发布时间】:2014-12-10 23:23:58
【问题描述】:

我有大量数据,其中包含访问网站的用户。我每次访问都有时间戳。使用http://jexp.de/blog/2012/10/parallel-batch-inserter-with-neo4j/ 脚本,我创建了一个图表,每个页面都有一个单独的路径

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 me->blog etc.

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

【问题讨论】:

    标签: groovy neo4j


    【解决方案1】:

    我假设您的节点标记为 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 节点。为防止此类重复,您应该在 UP 节点上使用 MERGE 而不是 CREATEMERGE 只会在节点不存在时创建节点,否则只会返回现有节点。拥有节点后,您可以继续使用CREATE 将它们链接在一起的关系(以时间戳作为属性)。

    【讨论】:

    • 对不起,我忘了说我已经对用户和页面进行了唯一性约束。
    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多