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]]
.
我正在尝试使用 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]]
.