Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 一个实例说明了关系类型索引和相关执行计划优化的必要性_Neo4j - Fatal编程技术网

Neo4j 一个实例说明了关系类型索引和相关执行计划优化的必要性

Neo4j 一个实例说明了关系类型索引和相关执行计划优化的必要性,neo4j,Neo4j,假设我有一个包含许多关系类型的大型知识库,例如hasChild、livesIn、locatedIn、capitalOf、largestCityOf 与所有节点和其他类型的关系相比,capicalOf关系的数量相对较少(例如,100个) 我想通过以下查询获取他们国家最大城市的任何资本: MATCH city-[:capitalOf]->country, city-[:largestCityOf]->country RETURN city 显然,明智的做法是以capitalOf类型为线

假设我有一个包含许多关系类型的大型知识库,例如hasChild、livesIn、locatedIn、capitalOf、largestCityOf

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

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

MATCH city-[:capitalOf]->country, city-[:largestCityOf]->country RETURN city
显然,明智的做法是以capitalOf类型为线索,扫描所有100个与此类型的关系,并通过[:largestCityOf]进行细化。然而,neo4j当前的执行计划引擎将执行AllNodesScan并进行扩展。为什么不考虑在当前查询优化引擎中添加一个“ReligsByTeSCAN”操作符,就像NodeByLabelScan做的那样?

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

START r=关系:rels(rtype=“capitalOf”)

告诉neo4j如何提高效率。但是,对于一个包含许多关系类型但没有节点id/标签/属性的更复杂的模式查询,显然优化引擎有责任决定从哪种关系类型开始

我看到很多问题都问同样的问题,但得到的答案是“否定的……查询通常从节点开始…”。我只想使用上面的典型场景再次询问原因


谢谢

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

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

1) 在绘制的关系上使用手动索引

2) 为节点指定标签。假设所有国家/地区节点都有一个
country
标签。您可以重写查询:

MATCH (city)-[:capitalOf]->(country:Country), (city)-[:largestCityOf]->(country) RETURN city
AllNodesScan
现在是一个
NodeByLabelScan
。该查询获取所有国家/地区并与城市匹配。因为每个国家都有一个首都和一个最大的城市,所以这是有效的,并且可以独立于图表的其他部分进行扩展


如果您将所有关系放在一个索引中,并尝试获取~100个
capitalOf
关系,则该操作将与图形中的关系总数成对数比例。

谢谢您的评论,@stefan