У меня есть график в neo4j (http://www.neo4j.org/) с узлами, представляющими людей. Некоторые из этих узлов имеют физическое местоположение, сохраненное (в различных свойствах: долгота, широта, location_name, location_id), но они также могут быть нулевыми.Закажите результаты neo4j cypher по результатам вычисления или переменной на лету
Я хотел бы построить запрос cypher, который заказывает результирующие узлы на расстояние от указанного физического местоположения узла. Например, я хочу выполнить запрос, начиная с идентификатора узла 42, который имеет longitude -122.419, широту 37.7793, location_name «Сан-Франциско, Калифорния» и location_id 114952118516947 и извлекает 10 ближайших людей к узлу 42 по физическому местоположению (кратчайшее расстояние). Я нашел ресурсы для вычисления (приблизительного) расстояния между двумя точками, используя долготы и широты, так что это не проблема.
Есть ли способ вычислить такую переменную для каждого посещенного узла, а затем упорядочить результаты по этой переменной?
Я понимаю, что это, вероятно, вычислительно дорогой, так вот альтернатива, что я пытаюсь работать:
- В запросе, проверьте 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). Сделайте другой запрос, если я хочу расширить расстояние.
Спасибо!
Спасибо, я не знал о Neo4j Spatial. Похоже, хорошо попробовать! Мы тестируем события на размещенном сервере neo4j, поэтому я думаю, что нам придется подождать, пока мы не сможем развернуть наши собственные. – ckbhodge