Neo4j 2.2: запрос Cypher Spatial с другими параметрами возвращает индекс не существует

Я использую Neo4j для поиска пользователей, которые находятся в радиусе 50 км и доступны в определенные дни.

Этот вопрос похож на этот другой вопрос, но индексы изменились начиная с Neo4J 2.0 решение не работает.

Я использую Neo4j 2.2.1, Neo4j-spatial 0.14 и py2neo/py2neo-spatial для взаимодействия с графиком.

Чтобы добавить пользовательские геометрии на график, я использую:

def create_geo_node(graph, node, layer_name, name, latitude, longitude):
  spatial = Spatial(graph)
  layer = spatial.create_layer(layer_name)
  node_id = node._id
  shape = parse_lat_long(latitude, longitude)
  spatial.create_geometry(geometry_name=name, wkt_string=shape.wkt, layer_name="Users", node_id=node_id)

.. который создает пространственные узлы по желанию.

Затем я хотел бы запросить график, выполнив:

START user=node:Users('withinDistance:[4.8,45.8,100]')
MATCH period=(start_date:Date)-[:NEXT_DAY*]->(end_date:Date)
    WHERE start_date.date="2014-03-03" AND end_date.date="2014-03-04"
    UNWIND nodes(period) as nodes_in_period
    OPTIONAL MATCH (nodes_in_period)<-[a:AVAILABLE]-(user:User)
    RETURN user.uuid, count(a)/count(nodes(period))

но запрос возвращает:

Index `Users` does not exist 
  • Кажется, что py2neo space.create_layer(..) создает слой, но не индекс (но должен ли он? .. поскольку индексы теперь являются «наследием» Neo4j 1. *)

  • Использование пространственного find_within_distance py2neo работает, но, поскольку он использует REST API, я не могу делать смешанные запросы, которые учитывают другие параметры.

  • Насколько я понимаю, START устарел, начиная с Neo4j 2.0, но я не могу найти правильный запрос Cypher для withinDistance в Neo4j 2.2.

Заранее спасибо,

Бенджамин


person bpipat    schedule 11.06.2015    source источник
comment
непонимание индексов здесь. возможно, неправильное использование языка на пространственной стороне.... но create_layer не создает типичный индекс Neo - он создает граф, который затем можно использовать для эффективного выполнения запросов пространственного типа на связанных узлах приложения. Вам никогда не придется беспокоиться об этом индексе.   -  person noisyboiler    schedule 12.06.2015


Ответы (2)


create_layer создает «пространственный» индекс, который отличается от индексов Neo. На самом деле он создает график, который моделирует для вас некоторые ограничивающие рамки, чтобы вы могли затем выполнять пространственные запросы к вашим данным. Вам не нужно напрямую ссылаться на этот индекс. Думайте об этом больше как о слое ГИС.

Вы можете просмотреть свой график и найти атрибуты узла, необходимые для написания собственного шифровального запроса.

Но вы также можете использовать пространственный API py2neo find_within_distance http://py2neo.org/2.0/ext/spatial.html#py2neo.ext.spatial.plugin.Spatial.find_within_distance

Надеюсь это поможет.

person noisyboiler    schedule 11.06.2015
comment
Спасибо @noisyboiler. Я уже использую пространственное расширение py2neo с find_within_distance, но, поскольку оно использует REST API, я не могу делать смешанные запросы. Я обновил свой вопрос, чтобы отразить это - person bpipat; 11.06.2015
comment
Я должен уточнить, что create_layer никогда не будет создавать индекс Neo под названием Users в вашем случае. Это совсем разные вещи. - person noisyboiler; 12.06.2015

Я думаю, что эти ссылки могут быть полезны: Запрос Neo4j Spatial 'WithinDistance' Cypher возвращает пустое значение, в то время как вызов REST возвращает данные * https://github.com/neo4j-contrib/spatial/issues/106

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

Можете ли вы протестировать пространство neo4j напрямую с помощью запроса REST (для создания слоя и пространственного узла), чтобы увидеть, что произойдет?

В противном случае, для вашего вопроса об условии запуска шифра, вам просто нужно поместить это условие в соответствие, например:

MATCH 
    user=node:Users('withinDistance:[4.8,45.8,100]'),
    period=(start_date:Date {date:'2014-03-03'})-[:NEXT_DAY*]->(end_date:Date {date:'2014-03-04'})
UNWIND nodes(period) as nodes_in_period
OPTIONAL MATCH (nodes_in_period)<-[a:AVAILABLE]-(user:User)
RETURN user.uuid, count(a)/count(nodes(period))
person logisima    schedule 11.06.2015