Запрос пространственного шифрования Neo4j в пределах расстояния не возвращает существующие узлы

Я использую подключаемый модуль пространственного сервера для Neo4j 2.0 и следую руководству по адресу http://neo4j.github.io/spatial/, чтобы добавить узел с именем Stockholm.

:POST http://localhost:7475/db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer
{
  "layer" : "geom",
  "lat" : "lat",
  "lon" : "lon"
}
:POST http://localhost:7475/db/data/index/node/
{
  "name" : "geom",
  "config" : {
    "provider" : "spatial",
    "geometry_type" : "point",
    "lat" : "lat",
    "lon" : "lon"
  }
}
:POST http://localhost:7475/db/data/node
{
  "lat" : 60.1,
  "lon" : 15.2,
  "name" : "Stockholm"
}
:POST http://localhost:7475/db/data/ext/SpatialPlugin/graphdb/addNodeToLayer
{
  "layer" : "geom",
  "node" : "http://localhost:7475/db/data/node/4"
}

Я могу получить узел через REST с помощью:

:POST http://localhost:7475/db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance
{
  "layer" : "geom",
  "pointX" : 15.0,
  "pointY" : 60.0,
  "distanceInKm" : 100
}

но не с шифрованным запросом ниже. Почему это? Я делаю какую-то очевидную ошибку здесь?

START n=node:geom('withinDistance:[60.0,15.0, 100.0]') RETURN n;

person Jenny Pettersson    schedule 13.03.2014    source источник


Ответы (2)


Чтобы выполнить запрос с помощью Cypher, вам нужно добавить каждый узел в индекс:

    :POST http://localhost:7474/db/data/index/node/geom
    {
      'value': 'dummy', 
      'key': 'dummy', 
      'uri': 'http://localhost:7474/db/data/node/NODE_ID_HERE'
    }

Недавно я написал сообщение в блоге о начале работы с Neo4j Spatial, в котором рассказывается об этом: http://lyonwj.com/mapping-the-worlds-airports-with-neo4j-spatial-and-openflights-part-1./

person William Lyon    schedule 15.03.2014
comment
Большое спасибо за ваш ответ и хорошую легкую для понимания статью! - person Jenny Pettersson; 17.03.2014
comment
Статья пропала. Любая новая ссылка? Попытка начать работу с пространственным пространством neo4j - person Peter R; 24.08.2016

Я только что обнаружил, что вам не нужно добавлять узел в индекс, как описано выше, по крайней мере, не для Neo4j 2.1.2 и Neo4j Spatial 0.13-neo4j-2.1.2.

После создания узла добавьте свойство, которое задает свойство «id» пользователя в значение идентификатора узла Neo4j. Теперь зашифрованный пространственный запрос будет работать. Итак, если вы добавите команду шифра

start n=node(4) n.id = id(n)

запрос будет работать.

Очевидно, что существуют и другие способы формирования оператора Cypher. На самом деле все это можно сделать в несколько объемных шагов. Вы можете добавить все свои узлы в граф RTree (используя REST, Java, массовый загрузчик файлов shp и т. д.), создать самореферентные свойства пользователя «id» на каждом узле, а затем создать пространственный индекс (вторая команда REST в вопросе сообщение).

Проблема, которую вы видите, возникает из-за разрыва связи между процессом REST addNodeToLayer и процессом Cypher «добавить узел в индекс». Процесс Cypher создает второй узел, который содержит только свойства геометрии (широта/долгота, wkt и т. д.) из исходного узла, и добавляет этот узел в граф RTree. Этот узел имеет пользовательское свойство с именем «id», которое имеет значение идентификатора узла Neo4j исходного узла. Процесс REST (или Java) addNodeToLayer напрямую добавляет исходный узел в граф RTree и не создает копию. Он также не устанавливает пользовательское свойство с именем «id» на узле.

Если вы добавили узел в граф RTree с помощью метода Cypher, вы обнаружите, что узел, возвращенный вам запросом REST, является узлом копии, а не исходным. Когда вы выполняете тот же запрос, используя метод Cypher, вы получаете исходный узел. Базовый код в запросе Cypher возвращает исходный узел, используя свойство «id» пользователя в узле копии, найденном запросом, чтобы получить исходный узел. Когда узел, первоначально найденный запросом Cypher, не содержит свойства id, которое может быть разыменовано, запрос Cypher автоматически терпит неудачу, и вы получаете 0 результатов.

Добавляя самореферентное свойство id к каждому узлу данных в графе RTree, запрос Cypher может успешно найти возвращаемый узел.

Использование метода REST, описанного в предыдущем ответе, работает, но в итоге стоимость хранения геометрии удваивается, поскольку создается копия информации о геометрии, хранящейся на исходном узле. При использовании этого метода результаты, возвращаемые запросами Cypher и REST, также отличаются друг от друга. Использование описанного метода экономит место и унифицирует поведение запросов Cypher и REST.

person Jim Biard    schedule 11.07.2014
comment
Джим, вы имеете в виду после того, как вы создадите узел и добавите его в слой, а затем установите идентификатор? Что произойдет, если я впоследствии изменю свойства lon/lat в узле; возвращает ли поиск по пространственному индексу правильные результаты? Я спрашиваю, потому что, когда я это делаю, он не видит изменения bbox в пространственных узлах. - person Dr Joe; 18.11.2014
comment
Не думаю, что порядок важен. Вы можете установить свойство id до или после добавления его в слой. Как я уже упоминал в комментарии к другому ответу, вы должны использовать метод REST updateGeometryFromWKT или метод java EditableLayer.update для изменения геометрии узла. - person Jim Biard; 19.11.2014
comment
Ах! EditableLayer.update — это то, чего мне не хватало! Я поиграю с этим и посмотрю, что произойдет. Спасибо. - person Dr Joe; 19.11.2014