一个显示关系类型指数和相关执行计划优化必要性的例子

时间:2015-04-08 05:08:33

标签: neo4j

假设我有很多关系类型的知识库,例如hasChild,livesIn,locatedIn,capitalOf,largestCityOf ......

与所有节点和其他类型的关系相比,capicalOf关系的数量相对较少(例如,一百个)。

我想通过以下查询获取任何也是本国最大城市的资本:

MATCH city-[:capitalOf]->country, city-[:largestCityOf]->country RETURN city

显然,将capitalOf类型作为线索是明智的,用这种类型扫描所有100个关系并通过[:largestCityOf]进行细化。然而,neo4j的当前执行计划引擎将执行AllNodesScan和Expand。为什么不考虑添加" RelationshipByTypeScan"运营商进入当前的查询优化引擎,就像NodeByLabelScan一样?

我知道我可以将关系类型转换为关系属性,使用旧索引对其进行索引并手动指示

START r=relationship:rels(rtype = "capitalOf")

告诉neo4j如何使其高效。但是对于具有许多关系类型但没有节点id / label / property开始的更复杂的模式查询,优化引擎显然有责任决定从哪个关系类型开始。

我看到很多问题都在问同样的问题,但得到的答案就像"否定...查询通常从节点开始......"。我只是想用上面的典型场景来再问为什么。

谢谢!

1 个答案:

答案 0 :(得分:0)

关系是其开始和结束节点的本地关系 - 没有全局关系字典。因此,像“给我全局x类型的所有关系”这样的操作是一项昂贵的操作 - 您需要遍历所有节点并收集匹配的关系。

有两种方法可以解决这个问题:

1)使用手绘的关系来绘制草图

2)为节点分配标签。假设所有国家/地区节点都有Country标签。您可以重写您的查询:

MATCH (city)-[:capitalOf]->(country:Country), (city)-[:largestCityOf]->(country) RETURN city

AllNodesScan现在是NodeByLabelScan。该查询抓取所有国家/地区并与城市匹配。由于每个国家都有一个大都市和一个最大的城市,因此这是有效的,并且可以独立于图表的其余部分进行扩展。

如果您将所有关系放在一个索引中并尝试抓住~100 capitalOf个关系,那么操作会与图表中的关系数进行对数比较。