我在 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)。如果我想扩大距离,请再次查询。
谢谢!