2013-06-27 3 views
2

У меня есть график в 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). Сделайте другой запрос, если я хочу расширить расстояние.

Спасибо!

ответ

4

Как насчет того, чтобы попытаться использовать внутри? например

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

+0

Спасибо, я не знал о Neo4j Spatial. Похоже, хорошо попробовать! Мы тестируем события на размещенном сервере neo4j, поэтому я думаю, что нам придется подождать, пока мы не сможем развернуть наши собственные. – ckbhodge