具有特定标签的Neo4j / Cypher / Traversing节点

时间:2014-08-22 10:02:02

标签: neo4j cypher neo4j-spatial

我正在使用Neo4j Spatial插件。

我们假设这个基本查询:

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

它将返回34公里范围内的所有车辆。

如果我只想检索种族汽车(使用标签),该怎么办?

没有空间我会这样做:

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

它会强制我打开所有节点,检查是否等于... =>糟糕的性能,尤其是当查询变得更复杂时(即使id被索引)。

什么是有效的解决方案?

更新-------------------

也许只比较节点更有效:

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

1 个答案:

答案 0 :(得分:3)

怎么样:

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

您基本上查找给定区域内的所有节点,然后在其标签包含Race时对其进行过滤。