Neo4j Spatial-Удалить слой, чтобы удалить добавленные узлы. Это ошибка или так задумано?

Я использую Neo4j 3.2 с плагином Neo4j Spatial 0.24-neo4j-3.1.1. После добавления слоев я попытался создать узел и добавить его в индекс с помощью пространственного.addNode

CALL spatial.addPointLayer('geom');

CREATE (n:Node {latitude:60.1,longitude:15.2})
WITH n
CALL spatial.addNode('geom',n) YIELD node
RETURN node;

Я также попытался создать новый и добавить в индекс позже.

CREATE (n:Node {latitude:60.1,longitude:55.2});

MATCH (n:Node {latitude:60.1,longitude:55.2})
WITH n
CALL spatial.addNode('geom',n) YIELD node
RETURN node;

Позже, когда я попытался позвонить

CALL spatial.removeLayer("geom");

Процедура удаляет все узлы, в том числе созданные

CREATE (n:Node {latitude:60.1,longitude:55.2});

Это поведение по дизайну?

Если да, можете ли вы предложить какой-либо другой способ обновить/удалить индексы без удаления узла местоположения? Здесь предлагается решение, но оно кажется хакерским и подверженным ошибкам, когда дело доходит до обновления информации индекса, когда узел местоположения меняет значение широты/долготы neo4j-spatial: Каков официальный способ удаления узла из пространственного индекса?


person LxL    schedule 25.06.2017    source источник


Ответы (1)


Я изучил исходный код пространственного пакета neo4j, чтобы увидеть, как реализованы процедуры addNode и removeLayer.

Когда вы вызываете addNode, сам узел будет напрямую добавлен в RTree, что означает, что он будет служить конечным узлом в RTree.

Когда вы вызываете removeLayer, все в RTree будет удалено из neo4j, включая все узлы и все ребра в этом RTree.

Поскольку я не нашел ни одного способа удалить информацию RTree, не касаясь листовых узлов, я бы предложил следующий способ:

Если вы хотите добавить узел в RTree, вы можете создать новый узел с тем же местоположением (реплицировать исходный узел) и создать ребро от исходного узла к этому новому. Таким образом, когда вы вызываете removeLayer, будут удалены только реплицированные вами узлы. Ваши исходные узлы не будут затронуты. Стоимость заключается в том, что вам нужно потратить больше места для хранения.

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

person Yuhan Sun    schedule 30.06.2017
comment
Я думал об этом подходе, но у него есть недостаток: когда мне нужно обновить исходный узел, мне нужно убедиться, что он синхронизирован с узлом RTree. Моя первоначальная проблема связана с необходимостью обновления RTree при изменении узла. И поскольку пространство neo4j этого не позволяет, я подумал, что могу просто удалить весь слой и снова запустить индексацию. Я оставлю эту награду открытой на следующие 6 дней, чтобы привлечь больше людей. Если больше нет ответа, я присуждаю его вам. - person LxL; 01.07.2017
comment
Пробовали ли вы эту процедуру: ¦ space.updateFromWKT ¦ Внутренняя процедура, обновляет узел геометрии с заданным идентификатором новой строкой WKT - person Yuhan Sun; 01.07.2017
comment
Не могли бы вы указать мне пример этой процедуры? Мне было непонятно, как работает эта процедура. - person LxL; 02.07.2017
comment
По этой ссылке: github.com/neo4j-contrib/spatial/blob/, вы можете видеть, что этот процесс принимает три параметра. Первый параметр — это имя слоя, второй — строка в формате wkt. Формат wkt можно найти по этой ссылке: en.wikipedia.org/wiki/Well-known_text . Третий параметр — это идентификатор узла, который необходимо обновить. - person Yuhan Sun; 05.07.2017
comment
Если вы успешно выполнили функцию, не могли бы вы поделиться своим примером здесь? Так как в сети мало соответствующей информации. Спасибо. - person Yuhan Sun; 06.07.2017
comment
В настоящее время я еще не пробовал эту процедуру. Я обновлю вопрос, как только успешно попробую. - person LxL; 08.07.2017