问题描述
我有一个图模型 >>> f'int {d[1]},str {d["2"]}'
'int one,str two'
(顶点)-> region
(边)-> has_person
(顶点)。我想获得 person
个顶点,其中 region
的名称为 Tom。
这个查询工作正常:
person
。
但是为什么以下查询会挂起:
g.V().hasLabel("person").has("name","Tom").inE("has_person").outV().hasLabel("region")
解决方法
在使用 Gremlin 编写图遍历时,您需要考虑您使用的图数据库如何优化您的遍历(例如,是否使用了全局索引)?
您应该考虑图形数据库的索引功能并检查 profile()
步骤的输出。它会告诉您是否正在使用索引以及在哪里使用。我的猜测是,“正常”工作的查询正在使用和索引来查找“Tom”,然后能够快速遍历该索引以查找具有与他相关的“has_person”边缘的区域。大多数图表都能够优化这种模式。您的以下“挂起”查询通常不会被大多数图形优化以使用索引,这主要是因为您使用 and()
步骤选择的模式不是大多数优化寻求的模式。我的猜测是这两个遍历几乎完全在内存中进行过滤。
Fwiw,您的查询“正常”是最佳的编写方式,我认为考虑到您所说的所需输出。我认为您的第一个挂起查询永远不会返回结果,因为它要求顶点具有既是“区域”又是“人”的标签,这是不可能的。第二个挂起查询似乎首先不需要 and()
,并且对“区域”标签进行了双重过滤。