假设我们有一个包含几个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大脑”......
答案 0 :(得分:2)
让我们一步一步地完成这项工作。
如果有N个非根节点,则添加额外的N ROOT
个关系是没有意义的。它在存储中非常非常昂贵,它将使用不需要存在的关系污染数据模型,并且可能不必要地使想要遍历路径的查询复杂化,并且它不是最快的方式找到子图中的所有节点。
为每个节点添加子图ID属性在存储方面也很昂贵(但不那么重要),并且需要:(a)扫描每个节点以找到所有节点特定ID(慢),或(b)使用索引,比如:Node(subgraph_id)
(更快)。方法(b),这是优选的,还要求所有节点具有相同的Node
标签。
但是等等,如果方法2(b)已经要求所有节点都被标记,为什么我们不为每个子组使用不同的标签?通过这样做,我们根本不需要subgraph_id
属性,我们也不需要索引!找到具有相同标签的所有节点的速度很快。
因此,使用每个子组标签将是最佳选择。