Neo4j标签和属性,以及它们的区别

时间:2016-04-16 16:55:17

标签: neo4j

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

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

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

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”那么

MATCH(n:BOBS_QA_COPY) return n

将挖掘子图中的所有节点。

我的问题是,何时使用花园品种,添加关系或设置标签是合适的?

设置标签以识别特定的子图让我觉得很奇怪,就像我滥用这个工具一样。我希望标签能说 是什么东西,而不是它的实例。

例如,如果我们正在绘制汽车信息图表,我可以看到标有“FORD EXPLORER”的部件。但是我不太确定标有“TONYS FORD EXPLORER”的零件是否合理。现在,我可以看到(USER id:“Tony”)与FORD EXPLORER图表有关系......

我可能会有一阵“SQL大脑”......

1 个答案:

答案 0 :(得分:2)

让我们一步一步地完成这项工作。

  1. 如果有N个非根节点,则添加额外的N ROOT个关系是没有意义的。它在存储中非常非常昂贵,它将使用不需要存在的关系污染数据模型,并且可能不必要地使想要遍历路径的查询复杂化,并且它不是最快的方式找到子图中的所有节点。

  2. 为每个节点添加子图ID属性在存储方面也很昂贵(但不那么重要),并且需要:(a)扫描每个节点以找到所有节点特定ID(慢),或(b)使用索引,比如:Node(subgraph_id)(更快)。方法(b),这是优选的,还要求所有节点具有相同的Node标签。

  3. 但是等等,如果方法2(b)已经要求所有节点都被标记,为什么我们不为每个子组使用不同的标签?通过这样做,我们根本不需要subgraph_id属性,我们也不需要索引!找到具有相同标签的所有节点的速度很快。

  4. 因此,使用每个子组标签将是最佳选择。