Gremlin:如何使用 math() 来过滤遍历结果?

Gremlin: How can I use math() to filter traversal results?

我正在尝试使用 math() 的数字结果来过滤遍历结果,但是我得到了我不明白的错误。我在网上看到的 math() 步骤的所有示例都是仅 returns 数字结果但其中 none 对其进行处理的查询。

这是我的:

g.V()
.hasLabel("user")
.values("targetDistance")
.is(
    lte(math(`abs(_ - ${searcherUser.locationLat}) * ${GPS_TO_KM}`).by("locationLat"))
)

这是我得到的错误示例(我不明白这种类型的错误):

"Cannot compare '51' (Integer) and '[MathStep(abs(_ - 5),[value(locationLat)])]' (DefaultGraphTraversal) as both need to be an instance of Number or Comparable (and of the same type)""

我想做的事情:

根据配置的设置获取附近用户的功能:targetDistance 值(以公里为单位)。但我也想根据自己的 targetDistance 排除太远的用户。换句话说:如果其中一个用户认为另一个用户太远,则彼此不应该看到他们。

我有第一部分工作(找到与搜索者用户最接近的部分):

   /**
    * Is inside the distance range the user wants
    */
   traversal = traversal.has(
      "locationLat",
      P.inside(
         searcherUser.locationLat - searcherUser.targetDistance * KM_TO_GPS,
         searcherUser.locationLat + searcherUser.targetDistance * KM_TO_GPS,
      ),
   );

   traversal = traversal.has(
      "locationLon",
      P.inside(
         searcherUser.locationLon - searcherUser.targetDistance * KM_TO_GPS,
         searcherUser.locationLon + searcherUser.targetDistance * KM_TO_GPS,
      ),
   );

lte这样的谓词不能将遍历作为参数。您需要将查询稍微重新表述为:

g.V().
  hasLabel('user').as('a').
  where(lte('a')).
     by('targetDistance').
     by(math(…..))

已编辑以添加...

举个具体的例子,使用航线数据集我们可能会做:

gremlin>   g.V().
......1>   hasLabel('airport').as('a').
......2>   where(gte('a')).
......3>      by('runways').
......4>      by(math('3+3')).
......5>   valueMap('city','code','runways')

==>[code:[BOS],city:[Boston],runways:[6]]
==>[code:[DFW],city:[Dallas],runways:[7]]
==>[code:[ORD],city:[Chicago],runways:[7]]
==>[code:[DEN],city:[Denver],runways:[6]]
==>[code:[DTW],city:[Detroit],runways:[6]]
==>[code:[AMS],city:[Amsterdam],runways:[6]] 

.