Arhn - архитектура программирования

Neo4j пространственное в пределах расстояния возвращает только один узел

Я использую плагин пространственного сервера для Neo4j 2.0, и мне удается добавить пользователей и города с их географическими свойствами широта/долгота в пространственный индекс «geom». К сожалению, я не могу получить правильный синтаксис, чтобы вернуть их через Neo4jClient :( В основном я хочу:

  1. Переведите шифрованный запрос START n=node:geom('withinDistance:[60.0,15.0, 100.0]') RETURN n; в синтаксис Neo4jClient, чтобы я мог получить всех пользователей на заданном расстоянии от указанной точки.

  2. Еще более полезным было бы, если бы можно было вернуть узлы с их соответствующим расстоянием до точки?

  3. Есть ли способ получить ближайшего пользователя или город из заданной точки без указания расстояния?


ОБНОВИТЬ

После некоторых проб и ошибок я решил вопрос 1 и проблему связи с пространством Neo4j через Neo4jClient. Ниже запрос Neo4jClient возвращает 1 пользователя, но только ближайшего, хотя база данных содержит 2 пользователей, которые должны быть возвращены. Я также безуспешно пробовал простой шифр через веб-интерфейс. Я совершенно неправильно понял, что должен делать внутриDistance? :) Неужели нет никого, кто мог бы дать небольшое представление о вопросах 2 и 3 выше? Было бы очень признательно!

var queryString = string.Format("withinDistance:[" + latitude + ", " + longitude + ", " + distance + "]");
        var graphResults = graphClient.Cypher
            .Start(new { user = Node.ByIndexQuery("geom", queryString) })
            .Return((user) => new
            {
                EntityList = user.CollectAsDistinct<UserEntity>()
            }).Results;

Ответы:


1

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

var geoQuery = client.Cypher
    .Start( new{n = Node.ByIndexLookup("geom", "withindistance", "[60.0,15.0, 100.0]")})
    .Return(n => n.As<????>());

но это генерирует шифр, например:

START n=node:`geom`(withindistance = [60.0,15.0, 100.0])   RETURN n

что не сработает, что, к сожалению, означает, что у вас есть два варианта:

  1. Получите код и создайте запрос на вытягивание, добавив его в
  2. Загрязняйтесь и используйте интерфейс IRawGraphClient. Сейчас это ОЧЕНЬ не одобряется, и я бы обычно не предлагал это, но я не вижу, чтобы у вас был большой выбор, если вы хотите использовать клиент как есть. Для этого вам нужно сделать что-то вроде: (извините, Тэтэм)

((IRawGraphClient)client).ExecuteGetCypherResults<Node<string>>(new CypherQuery("START n=node:geom('withinDistance:[60.0,15.0, 100.0]') RETURN n", null, CypherResultMode.Projection));

Я не знаю пространственную систему, поэтому вам придется подождать, пока кто-то, кто ее знает, ответит вам на другие вопросы, и я понятия не имею, что возвращается (отсюда тип возврата Node<string>, но если вы чтобы это сработало, вы должны изменить это на правильный POCO.

26.03.2014
  • Привет Крис! Этот ответ был своего рода подозрением, но, очевидно, не тем, на который я надеялся :) Вы знаете, есть ли какие-либо планы по улучшению пространственной поддержки Neo4jClient в будущем? За исключением этой пространственной неудачи, я теперь благодаря вашим прежним инструкциям привыкаю к ​​работе с Neo4jClient, и я очень ценю это! 26.03.2014
  • Что ж, я бы сказал, что на данный момент никаких планов, насколько я знаю, скорее всего, вы получите его от кого-то другого. Spatial все еще находится в версии 0.12 — так что, возможно, маловероятно даже на какое-то время, поскольку он может оказаться слишком движущейся целью, и до сих пор никто не поднял вопрос по этому поводу (пока). Извините, это не очень помогает! 26.03.2014
  • Ах я вижу. Вышеприведенный запрос IRawGraphClient работает, но я не уверен, как передать широту, долготу и расстояние в качестве параметров запроса, и я не могу найти никаких примеров. Я попробовал следующий запрос, который явно неверен:) var graphResults = ((IRawGraphClient)graphClient) .ExecuteGetCypherResults‹CityEntity›(new CypherQuery(START n=node:geom('withinDistance:[{широта}, {долгота}, {расстояние }]') RETURN n, queryParameters, CypherResultMode.Set)); 26.03.2014
  • Я думаю, вам нужно спросить у парней, которые написали бит Spatial, что вы можете делать с параметрами - код правильный концептуально, так как в нем будут добавлены параметры, но может ли пространственный Cypher справиться с этим... :| 27.03.2014

  • 2

    После проб и ошибок и помощи экспертов группы Neo4j google все мои проблемы теперь решены :)

    1. Neo4jClient можно использовать для запросов в пределах расстояния, как показано ниже. К сожалению, внутриDistance не может нормально обрабатывать прикрепляемые параметры, поэтому вы, вероятно, захотите проверить свою широту, долготу и расстояние перед их использованием. Кроме того, эти показатели должны быть удвоены, чтобы запрос работал.

      var queryString = string.Format("withinDistance:[" + latitude + ", " + longitude + ", " + distance + "]");
      var graphResults = graphClient.Cypher
                      .Start(new { city = Node.ByIndexQuery("geom", queryString) })
                      .Where("city:City")
                      .Return((city) => new
                      {
                          Entity = city.As<CityEntity>()
                      })
                      .Limit(1)
                      .Results;
      
    2. Cypher не может быть использован для возврата расстояния, вы должны рассчитать его самостоятельно. Очевидно, вы должны иметь возможность использовать REST http://localhost:7474/db/data/index/node/geom?query=withinDistance:[60.0,15.0,100.0]&ordering=score, чтобы получить счет (расстояние), но у меня это не сработало, и я хочу использовать пользовательский шифр.

    3. Нет, но ограничьте результат до 1, как в приведенном выше запросе, и все будет в порядке.

    Последнее замечание по этому вопросу: вы не должны добавлять свои узлы к пространственному слою только пространственный индекс. У меня было много проблем и странных исключений, прежде чем я понял это.

    02.04.2014
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..