2014-03-13 119 views
45

我使用neo4j为我的项目之一,有一个节点只有一个属性为name,我想要使用ID获取该节点,它已经有一个ID,但是当我使用此代码Neo4J通过ID获取节点

MATCH (s:SKILLS{ID:65110}) return s

它没有返回,我的继承人节点

enter image description here

如果查询是错误的,那么我怎么查询它使用数字

回答

75
MATCH (s) 
WHERE ID(s) = 65110 
RETURN s 

ID function得到你的节点或关系的id。这与您创建的名为idID的任何属性都不同。

+1

有什么不同的方式来得到这样的数据(S:SomeLabel {ID:65110})? – DonkeyKong

+0

@DonkeyKong不,因为你也可以添加id属性,这是id以外的东西。一个id属性可以有任何类型,而node或edge id是一个无符号整数,链接到Neo4J内部结构中的一个位置。 – pvoosten

+12

标准免责声明:不要将内部Neo4j ID用于长期实体标识。出于性能的考虑,未来的Neo4j版本可能会将这些ID转移。创建您自己的唯一ID属性(理想情况下用'CONSTRAINT')来跟踪实体 –

1

你可以说:

(n:User) where id(n) >=20 RETURN n 

这将返回一个类型用户的所有节点与节点参考ID超过20

5

警告:以下答案不正确! START should only be used when accessing legacy indexes。这是disabled in Cypher 2.2 and up

的Neo4j recommends using WHERE ID(n) =,并进一步指出,它will only require a single lookup (does not scan every node to find the matching ID)

保持这个答案,防止别人犯同样的错误。

可以使用WHERE ID(s) = 65110,但这会检查每个节点的ID在你的数据库。

有一种更有效的方式来做到这一点:

START s=NODE(517) MATCH(s) RETURN s 
+0

EXPLAIN和PROFILE的结果对于简单的查询显示@Code是正确的。为什么这不在文档中? – Sonata

+0

@Sonata你正在运行什么版本?较新版本的Neo4j应该使START不再使用。 –

+0

3.0.7。在控制台中查看这些示例中的“Result Details”:http://console.neo4j.org/r/dbz1we(执行AllNodesScan)和http://console.neo4j.org/r/9076wd(正在做NodeById) – Sonata