这个概念适用于图形数据库吗?

时间:2015-02-19 12:39:22

标签: neo4j graph-databases

我一直在阅读有关Graph数据库的内容,并想知道这种类型的结构是否适用于它:

公司>拥有用户帐户>帐户发送Facebook帖子(所有用户都可以使用)

到此为止 - 我认为这是有道理的 - 是的,它可以很好地利用Graph。帖子与任何帐户都有关系,您可以找到双向的方向 - 公司的帖子以及哪些用户或公司发送的帖子。

然而

  • 每天都会添加和删除用户,我需要一个记录存储,显示在给定时间内有多少
  • 我每天需要存储的每个帖子(喜欢/朋友)的帐户都会收到结果
  • 我需要了解公司收到的有多少喜欢(在任何一天)
  • 我还需要了解用户收到了多少喜欢
  • 我需要了解每位用户收到的用户数量
  • 你需要将Likes作为一个组存储,然后存储日期值 - 你甚至可以拥有" sub"属性?

除非你为每个节点存储大量的日期值属性列表,否则我在这一点上很困难。这是你的方式吗?如果我想找出后面的两点,例如它是否与RDBMS一样有效?

1 个答案:

答案 0 :(得分:4)

这是一个非常简单的Graph数据模型示例,它似乎涵盖了您陈述的用例。 (由于节点可以有多个标签,所有CompanyUser节点也是Entity个节点 - 以简化模型。)

(:Company:Entity {id:100})-[:HAS_USER]->(:User:Entity {id: 200})
(:Entity)-[:SENT]->(:Post {date: 123, msg: "I like cats!"})
(:Entity)-[:LIKES {date: 234}]->(:Post)

您的使用案例:

  1. 用户每天都会被添加和删除,我需要一个记录存储,显示在给定时间内有多少。

    如何统计所有用户:

    MATCH (u:User)
    RETURN COUNT(*);
    

    如何统计公司的用户:

    MATCH (c:Company {id:100})-[:HAS_USER]->(u:User)
    RETURN COUNT(*);
    
  2. 我需要了解公司收到的有多少喜欢(在任何一天)

    MATCH (c:Company {id: 100})-[:SENT]->(p:Post)<-[:LIKES {date:234}]-()
    RETURN COUNT(*)
    
  3. 我还需要了解用户收到了多少喜欢

    MATCH (u:User {id:200})-[:SENT]->(p:Post)<-[:LIKES]-()
    RETURN COUNT(*);
    
  4. 我需要了解每位用户收到的用户数量

    MATCH (u:User {id:200})-[:SENT]->(p:Post)<-[:LIKES]-()
    RETURN p, COUNT(*)
    
  5. 您需要将Likes作为一个组存储,然后存储日期值 - 您甚至可以拥有“子”属性吗?

    您不需要按日期明确分组喜欢(如果这是您的意思)。通过适当的查询(例如,在上面的#2中)可以很容易地获得这种“分组”。