假设我有很多关系类型的知识库,例如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开始的更复杂的模式查询,优化引擎显然有责任决定从哪个关系类型开始。
我看到很多问题都在问同样的问题,但得到的答案就像"否定...查询通常从节点开始......"。我只是想用上面的典型场景来再问为什么。
谢谢!
答案 0 :(得分:0)
关系是其开始和结束节点的本地关系 - 没有全局关系字典。因此,像“给我全局x类型的所有关系”这样的操作是一项昂贵的操作 - 您需要遍历所有节点并收集匹配的关系。
有两种方法可以解决这个问题:
1)使用手绘的关系来绘制草图
2)为节点分配标签。假设所有国家/地区节点都有Country
标签。您可以重写您的查询:
MATCH (city)-[:capitalOf]->(country:Country), (city)-[:largestCityOf]->(country) RETURN city
AllNodesScan
现在是NodeByLabelScan
。该查询抓取所有国家/地区并与城市匹配。由于每个国家都有一个大都市和一个最大的城市,因此这是有效的,并且可以独立于图表的其余部分进行扩展。
如果您将所有关系放在一个索引中并尝试抓住~100 capitalOf
个关系,那么操作会与图表中的总关系数进行对数比较。