2

我在 neo4j ( http://www.neo4j.org/ ) 中有一个图表,其中的节点代表人。其中一些节点保存了物理位置(在各种属性中:经度、纬度、位置名称、位置 ID),但它们也可以为零。

我想构建一个密码查询,按与源节点列出的物理位置的距离对结果节点进行排序。例如,我想从节点 id 42 开始查询,它的经度为 -122.419,纬度为 37.7793,location_name 为“旧金山,加利福尼亚”,location_id 为 114952118516947,并按物理位置(最短距离)检索离节点 42 最近的 10 个人。我找到了使用经度和纬度计算两点之间(近似)距离的资源,所以这不是问题。

有没有办法为每个访问的节点计算一个变量,然后按该变量对结果进行排序?

我意识到这可能在计算上很昂贵,所以这是我试图开始工作的另一种选择:

  • 在查询中,检查节点的 location_id 或 location_name 是否与源节点的匹配,并首先对匹配的节点进行排序。(不是一个完美的解决方案,但在短期内可能可以接受)

当我尝试将 ORDER BY ( http://docs.neo4j.org/chunked/milestone/query-order.html ) 与从 WITH 运算符 ( http://docs.neo4j.org/chunked/stable计算的变量一起使用时/query-with.html),我收到此错误:

SyntaxException: Unknown identifier `flag`.

这是完整的查询:

start n = node(42) match (n)<-[:friends]->(f) WITH f, (f.fb_location_id = 114952118516947) AS flag RETURN DISTINCT f ORDER BY flag LIMIT 10

如果这是不可能的,那么解决这个问题的最佳方法是什么?

  • [过滤结果不排序] 在查询之前,计算在可接受距离(例如 20 英里)内的经纬度组合的范围,然后从结果中过滤掉其他的。如果我想扩大距离,请再次查询。
  • [过滤结果不排序] 在查询之前,找出哪些位置(城市)在可接受的距离内(例如 20 英里),然后从结果中过滤掉其他位置(使用 location_id)。如果我想扩大距离,请再次查询。

谢谢!

4

1 回答 1

4

尝试使用 withinDistance 怎么样?例如

START n=node:people('withinDistance:[53.489271,-2.246704, 20.0]')
<conditions here>
RETURN n

此处提供的纬度/经度是您示例中节点 42 的位置,20.0 是以公里为单位的最大距离。如果您使用的是 Neo4j 1.9+,请查看http://architects.dzone.com/articles/neo4jcypher-finding-football,它很好地介绍了您可以使用 Neo4j Spatial 做什么。

注意:withinDistance 的结果默认按距离排序,asc

于 2013-06-27T03:21:42.160 回答