Узлы Neo4j / Cypher / Traversing с определенной меткой

Я использую плагин Neo4j Spatial.

Предположим, этот базовый запрос:

START c = node:carslocation('withinDistance:[2.3725963,48.892067, 34.0]') 
RETURN c

Возвращает все машины в пределах 34 км.

Что, если я хочу получить только гоночные автомобили (с помощью ярлыков).

Без Spatial я бы сделал:

MATCH (c:Race)
RETURN c 

Теперь, если я хочу, чтобы все гоночные машины были в пределах 34 км, у меня было бы:

START c = node:carslocation('withinDistance:[2.3725963,48.892067, 34.0]') 
MATCH (c:Race)
RETURN c

=> Cannot add labels or properties on a node which is already bound.
Действительно, c уже был привязан к первой строке.

Я не хочу этого делать:

START c = node:carslocation('withinDistance:[2.3725963,48.892067, 34.0]') 
MATCH (cr:Race)
WHERE cr.id = c.id
RETURN cr

Это заставило бы меня открыть все узлы, чтобы проверить равенство ... => плохая производительность, особенно когда запрос становится более сложным (даже если идентификатор индексируется).

Что может быть эффективным решением?

ОБНОВЛЕНИЕ -------------------

Возможно, сравнение только узлов более эффективно:

START c = node:carslocation('withinDistance:[2.3725963,48.892067, 34.0]') 
MATCH (cr:Race)
WHERE cr = c
RETURN cr

Is it?


person Mik378    schedule 22.08.2014    source источник


Ответы (1)


Как насчет:

START c = node:carslocation('withinDistance:[2.3725963,48.892067, 34.0]') 
WHERE 'Race' in labels(c)
RETURN c

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

person Stefan Armbruster    schedule 22.08.2014
comment
Отлично! :) Так это более эффективно, чем второе решение, которое я написал в разделе обновлений? - person Mik378; 22.08.2014
comment
Это зависит от количества узлов, найденных пространственным запросом, по сравнению с количеством узлов, имеющих метку Race. Обрисованный мною запрос выполняет запрос индекса и ищет все узлы, на которые ссылается результат запроса индекса. Поэтому я считаю, что в большинстве случаев это более эффективно. - person Stefan Armbruster; 22.08.2014
comment
Если вы выполняете START c=node:carslocation .... MATCH (cr:Race) WHERE ...., вы выполняете индексный запрос, загрузите все узлы для его результата И найдите все узлы, несущие метку Race глобально. - person Stefan Armbruster; 22.08.2014