Neo4j标签和属性及其差异

Neo4j标签和属性及其差异,neo4j,Neo4j,假设我们有一个Neo4j数据库,其中包含50000个节点子图。每个子图都有一个根。我想在一个子图中找到所有节点 一种方法是递归地遍历树。它可以工作,但可以访问数千次数据库 一种方法是向每个节点添加子图标识符: MATCH(n {subgraph_id:{my_graph_id}}) return n 另一种方法是将子图中的每个节点与子图的根相关联: MATCH(n)-[]->(root:ROOT {id: {my_graph_id}}) return n 如果这很重要的话,这感觉更像是

假设我们有一个Neo4j数据库,其中包含50000个节点子图。每个子图都有一个根。我想在一个子图中找到所有节点

一种方法是递归地遍历树。它可以工作,但可以访问数千次数据库

一种方法是向每个节点添加子图标识符:

MATCH(n {subgraph_id:{my_graph_id}}) return n
另一种方法是将子图中的每个节点与子图的根相关联:

MATCH(n)-[]->(root:ROOT {id: {my_graph_id}}) return n
如果这很重要的话,这感觉更像是“图形”。看起来很贵

或者,我可以为每个节点添加一个标签。如果{my_graph_id}是“BOBS_QA_COPY”,那么

将收集子图中的所有节点

我的问题是什么时候适合使用花园品种属性、添加关系或设置标签

设置一个标签来标识一个特定的子图会让我觉得很奇怪,就像我滥用了这个工具一样。我希望标签能说明某事物是什么,而不是它是某事物的哪个实例

例如,如果我们正在绘制汽车信息图,我可以看到标有“FORD EXPLORER”的零件。但我不太确定将零件标记为“TONYS FORD EXPLORER”是否有意义。现在,我可以看到(用户id:“Tony”)与FORD EXPLORER图形有关联


我可能有点“SQL大脑”…

让我们一步一步地解决这个问题

  • 如果有N个非根节点,则添加额外的N
    root
    关系最不合理。它在存储方面非常昂贵,它会用不需要的关系污染数据模型,并且会不必要地使想要遍历路径的查询复杂化,而且它不是查找子图中所有节点的最快方法

  • 将子图ID属性添加到每个节点的存储成本也很高(但较低),需要:(a)扫描每个节点以查找具有特定ID的所有节点(慢),或者(b)使用索引,例如,
    :node(subgraph_ID)
    (快)。更可取的方法(b)还要求所有节点具有相同的
    节点
    标签

  • 但是等等,如果方法2(b)已经要求标记所有节点,为什么我们不为每个子组使用不同的标签呢?通过这样做,我们根本不需要
    subgraph\u id
    属性,也不需要索引!找到具有相同标签的所有节点非常快


  • 因此,使用每个子组标签将是最好的选择。

    每个子组标签的一个问题是:标签(属性)上的索引处于启用状态-如果需要索引功能,则需要为每个子组标签创建一个。@TimKuehn。如果没有太多的子组,这不是一个大问题。如果有很多,那么您也可以给每个节点一个额外的公共标签,并将其用于所有公共索引。50K节点太多了-您真的需要一次全部使用它们吗?
    MATCH(n:BOBS_QA_COPY) return n