Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4J—将元素存储为用户的属性还是作为节点&;关系_Neo4j_Query Optimization_Nodes - Fatal编程技术网

Neo4J—将元素存储为用户的属性还是作为节点&;关系

Neo4J—将元素存储为用户的属性还是作为节点&;关系,neo4j,query-optimization,nodes,Neo4j,Query Optimization,Nodes,我在设计一个拥有百万用户的图形模型时遇到了一个问题。我需要存储用户已注册或未注册的信息。 如我所见,我们有两种选择: 在每个用户节点中存储属性“register=true/false”。因此,有了100万用户,我们就有了100万个属性“register” 存储一个已注册的节点,然后仅为已注册用户建立与该节点的关系。因此,我们的关系数与注册用户的关系数完全相等 在性能搜索中,哪一个选项更适合最小存储空间 提前感谢,将数据建模为图形是一件很难精确确定的事情。通常,当涉及到NoSQL数据库时,最重要的

我在设计一个拥有百万用户的图形模型时遇到了一个问题。我需要存储用户已注册或未注册的信息。 如我所见,我们有两种选择:

  • 在每个用户节点中存储属性“register=true/false”。因此,有了100万用户,我们就有了100万个属性“register
  • 存储一个已注册的节点,然后仅为已注册用户建立与该节点的关系。因此,我们的关系数与注册用户的关系数完全相等
  • 在性能搜索中,哪一个选项更适合最小存储空间


    提前感谢,

    将数据建模为图形是一件很难精确确定的事情。通常,当涉及到NoSQL数据库时,最重要的是要考虑如何使用您的数据,并基于该模型对其进行建模。 使用外部节点可能会遇到性能问题,因为Neo4J通常在遍历过程中会遇到问题,因为它在单个节点中接近10000个关系。通过外部“注册”节点,您将远远超过该限制;另一方面,只要不将搜索锚定到该节点,就应该可以了

    无论您选择哪条路线,您在评论中描述的查询都可能以用户为中心(从用户开始),然后遍历到他们的朋友是谁,然后对于每个朋友,它将检查是否正确

    A.“已注册”属性是否设置为“真” B.与“已注册”节点有关系

    这些方法中的每一种似乎都有相似的执行时间,对“registered”属性的索引将产生微不足道的影响,因为它没有被用作锚(大概;您必须使用这两种方法对查询进行分析才能确定)。所以,就像你提到的,人们可能会考虑空间限制。 除此之外,从性能分析的角度来看,我可以看到这两种方法之间没有太大的差异


    @InverseFalcon提到的第三个选项是在已注册的节点上使用额外的标签“:registed”。这可能会导致比将其保留在属性中更快的比较时间,因为标签将内联到节点存储中,并且可以在那里进行检查,而属性可能对属性存储具有额外的间接级别。

    您的问题的答案取决于您将来计划如何使用此数据:具体是您希望进行何种查询。@stdob--我想知道用户的列表朋友,谁已注册,谁未注册。当然,我有一个关系,每个用户谁是朋友。如果对于
    user
    节点,这是一个简单的值,没有任何附加属性,那么将其存储为每个节点的属性会更方便,并且不要忘记为其创建索引以加快搜索速度。如果这是一个复杂的事实(注册时间、注册事实的任何附加数据等),将其取出到一个单独的节点是有意义的。@stdob--可能我需要存储注册时间,那么最好将其取出到一个单独的节点。我还发现一些关于大小和硬件计算器的信息显示:节点占用15B的空间,关系占用31B的空间,属性占用41B的空间。因此,存储关系占用的空间比属性少。有第三个选项,您可以在节点上添加:注册标签。标签检查通常比属性读取便宜。你是说一个节点可以有多个标签?目前这些节点有一个标签是:Person,因为在我的图中会有很多类型的节点。作为第三个选项,这些节点将同时具有:Person和:Registered label?可以查询吗?我还需要知道注册时间。因此,我认为分离a:registed节点并创建与label:Register和property time的关系更合适。在这种情况下还有其他选择吗?谢谢。@Alex是的,节点绝对可以有多个标签。它们也会根据标签自动编制索引,所以根据标签进行查询很好。查询时,不需要给出所有标签;一个标签就足够了(如果不需要,则没有标签);e、 g.(p:Person)与(p:Person:Registered)一样有效,尽管第二个查询可能会导致扫描:Person节点(引擎将查找所有:Person节点,而不是扫描每个:Registered标签)。正如InverseFalcon所提到的,这通常比扫描属性的特定值还要快。值得一提的是,如果我需要表示注册日期,我可能会将注册作为包含日期/时间戳的属性,而将未注册的属性保留为不包含该属性。检索关系上的属性的性能并不差,但如果要按关系上的属性进行筛选(搜索),则其性能可能不如节点本身上的筛选。这取决于您正在运行的确切查询,我再次建议,如果需要调优,您可以自由地配置查询。