Neo4J-存储到关系与节点中

Neo4J-存储到关系与节点中,neo4j,graph-databases,relationships,Neo4j,Graph Databases,Relationships,我想知道将数据存储到关系或节点中是否有任何优点或缺点 例如,如果我要将与讨论相关的注释存储到数据库中,我应该将注释数据存储在“注释”关系中,还是存储在通过单独关系与讨论相关的“注释”节点中。正确的数据模型取决于您需要进行的查询类型。您应该弄清楚您的查询是什么,然后确定满足以下条件的数据模型: 它允许您回答所有问题 它可以让您的查询足够快地完成 它最大限度地减少了所需的数据库存储 在讨论评论的情况下,您可能希望查询按时间顺序排列的讨论线程。因此,您不仅需要存储发表评论的时间,还需要存储评论之间的关

我想知道将数据存储到关系或节点中是否有任何优点或缺点


例如,如果我要将与讨论相关的注释存储到数据库中,我应该将注释数据存储在“注释”关系中,还是存储在通过单独关系与讨论相关的“注释”节点中。

正确的数据模型取决于您需要进行的查询类型。您应该弄清楚您的查询是什么,然后确定满足以下条件的数据模型:

  • 它允许您回答所有问题
  • 它可以让您的查询足够快地完成
  • 它最大限度地减少了所需的数据库存储
  • 在讨论评论的情况下,您可能希望查询按时间顺序排列的讨论线程。因此,您不仅需要存储发表评论的时间,还需要存储评论之间的关系(因为讨论可能会产生不相交的线程,这些线程不共享相同的先前评论)

    让我们尝试一个简单的测试用例。假设有两个不相交的线程由相同的初始注释生成(我们称之为
    c1
    ):[c1,c3]和[c1,c2,c4]。在这个简单的测试用例中,假设我们只对查询与主题相关的所有注释线程感兴趣

    如果注释属性存储在节点中,则数据可能如下所示:

    (u1:User {name: "A"})-[:MADE]->(c1:Comment {time:0, text: "Fee"})-[:ABOUT]->(s1:Subject {title: "Jack"})
    (u2:User {name: "B"})-[:MADE]->(c2:Comment {time:1, text: "Fie"})-[:ABOUT]->(c1)
    (u3:User {name: "C"})-[:MADE]->(c3:Comment {time:3, text: "Foe"})-[:ABOUT]->(c1)
    (u4:User {name: "D"})-[:MADE]->(c4:Comment {time:9, text: "Fum"})-[:ABOUT]->(c2)
    
    如果您将注释属性存储在关系中,您可能会尝试以下操作,但存在一个很大的缺陷。一个关系无法直接指向另一个关系(正如我们在第2行到第4行中尝试的那样)。由于该模型在neo4j中不合法,因此不符合上述任何标准

    (u1:User {name: "A"})-[c1:COMMENTED_ABOUT {time:0, text: "Fee"}]->(s1:Subject {title: "Jack"})
    (u2:User {name: "B"})-[c2:COMMENTED_ABOUT {time:1, text: "Fie"}]->(c1)
    (u3:User {name: "C"})-[c3:COMMENTED_ABOUT {time:3, text: "Foe"}]->(c1)
    (u4:User {name: "D"})-[c4:COMMENTED_ABOUT {time:9, text: "Fum"}]->(c2)
    
    因此,在我们的简单测试用例中,将属性存储在节点中似乎是唯一的选择

    下面是一个查询,用于获取不相交的线程路径,包括做出每个注释的用户(
    WHERE
    子句过滤掉部分线程):

    MATCH p=(s:Subject)
    
    MATCH p=(s:Subject)<-[:ABOUT*]-(c:Comment)<-[m:MADE]-(u:User)
    WHERE NOT (c)<-[:ABOUT]-()
    RETURN p