【问题标题】:Node in multiple linked list多链表中的节点
【发布时间】:2016-05-25 09:23:59
【问题描述】:

在我们的 NEO4j 图表中,我们创建了指定类别的顶级项目的 serval 链接列表。

例子:

2016 年 1 月前 50 周 - 迈克波斯纳 - 非洲杰克 - 威利威廉

此时我们创建了这个:

 (node top 50 week 201601)-[first]->(node mike posner)-[next]->(node afrojack)-[next]->(node willy).

但现在下周,顺序更改为 Willy、Mike、Afro。现在我们最终对每个艺术家都有多个下一个关系。遍历列表会明显变慢。

任何想法,我们如何以更好的方式对此进行建模。

【问题讨论】:

    标签: database-design graph neo4j


    【解决方案1】:

    来自@stdob-- 的答案非常有效,但是这不能很好地扩展。

    想象一下,您想找到所有排名第一的艺术家以及多少次,您必须匹配所有这些艺术家,并遍历所有关系并过滤 rank 属性。如果你有 100 万艺术家,那将是一场噩梦。

    LinkedList 的想法很好,但 LinkedList 中的节点可以是例如与艺术家相关的RankItem 节点。

    (week1)-[:FIRST]->(rankItem)<-[:HAS_RANKING_POSITON]-(artist)
    

    对于上一个问题,你可以简单地做:

    MATCH (w:Week)-[:FIRST]->()<-[:HAS_RANKING_POSITION]-(artist)
    RETURN artist, count(*) as occurences
    

    根据您需要执行的查询,有时拥有一个 RankItem 也将连接到的 RankingList 也是有意义的。

    (ranking {v:1})-[:NEXT]->(ranking {v:2})-[:NEXT]->(.....
    

    在这种情况下,RankingItem 也将连接到列表

    为以下问题提高性能:

    根据艺术家,找到具有共同模式的艺术家 排名历史

    【讨论】:

    • 如果我们需要计算艺术家进入前 10 或前 25 的次数怎么办?
    • 简单,MATCH (w:Week)-[:FIRST|:NEXT*10]-&gt;(rank)&lt;-[:HAS_RANING_POSITION]-(artist) RETURN artist, count(*)
    • 没错。你的链表版本比我的决定要好。特别是它允许在中间节点rankItem中存储附加信息。
    • 是的,当然,您还可以将 RankItem 链表与时间树结合起来(效果很好)
    【解决方案2】:

    我想你会接近这个模型:

    (T1:Top {name:'Top week1'})-[:include {rank:0}]->(P1:Person {name: 'mike posner'})
    (T1:Top {name:'Top week1'})-[:include {rank:1}]->(P1:Person {name: 'afrojack'})
    (T1:Top {name:'Top week1'})-[:include {rank:2}]->(P1:Person {name: 'willy'})
    
    (T2:Top {name:'Top week2'})-[:include {rank:1}]->(P1:Person {name: 'mike posner'})
    (T2:Top {name:'Top week2'})-[:include {rank:0}]->(P1:Person {name: 'afrojack'})
    (T2:Top {name:'Top week2'})-[:include {rank:2}]->(P1:Person {name: 'willy'})
    
    (T3:Top {name:'Top week3'})-[:include {rank:2}]->(P1:Person {name: 'mike posner'})
    (T3:Top {name:'Top week3'})-[:include {rank:1}]->(P1:Person {name: 'afrojack'})
    (T3:Top {name:'Top week3'})-[:include {rank:0}]->(P1:Person {name: 'willy'})
    

    并查询以获取特定周的顶部:

    MATCH (T:Top {name:'TOP week1'})-[r:include]->(P:Person) 
    RETURN P.name, r.rank ORDER BY r.rank
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-03
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      相关资源
      最近更新 更多