Neo4J通过ID获取节点


84

我在一个项目中使用neo4j,有一个节点只有一个属性name,我想使用ID获取该节点,它已经有一个ID,但是当我使用此代码时

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

它什么也不返回,这是我的节点

在此处输入图片说明

如果查询错误,那么我如何使用数字查询


您使用哪种图形可视化工具?谢谢。我知道yworks.com/neo4j-explorer自定义的好选择。
MyUserInStackOverflow

Answers:


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

ID函数获取节点或关系的ID。这不同于任何称为idID您创建的属性。


1
是否有任何其他方式来获取数据(s:SomeLabel {id:65110})?
DonkeyKong 2015年

@DonkeyKong不,因为您还可以添加id属性,这是id以外的东西。id属性可以是任何类型,而节点或边缘id是无符号整数,链接到Neo4J内部结构中的某个位置。
pvoosten 2015年

25
标准免责声明:请勿使用内部Neo4j ID进行长期实体识别。Neo4j的未来版本可能会出于性能目的而转移这些ID。创建您自己的唯一ID属性(最好使用CONSTRAINT)来跟踪实体
Brian Underwood

添加官方暗号的文档段落,如果有人感兴趣的是:neo4j.com/docs/cypher-manual/current/clauses/match/...
Ziemowit Stolarczyk的

13

警告:以下答案不正确!START仅应在访问旧索引时使用在Cypher 2.2及更高版本中,它被禁用

Neo4j建议使用WHERE ID(n) = ,并且进一步指出,它只需要进行一次查找(不会扫描每个节点以找到匹配的ID)

保持这个答案可以防止任何人犯同样的错误。

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

有一种更有效的方法可以做到这一点:

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

来自EXPLAIN和PROFILE的简单查询结果显示,@ Code是正确的。为什么不在文档中?
奏鸣曲

@Sonata您正在运行什么版本?较新版本的Neo4j应该会使START过时。
编码

3.0.7。看一下Result Details这些控制台中的示例:console.neo4j.org/r/dbz1we(执行AllNodesScan)和console.neo4j.org/r/9076wd(执行NodeById)
Sonata,

@Sonata我不确定为什么会这样。首先,它不起作用-文档指出START从Cypher 2.0起已被弃用,从Cypher 2.2起已被禁用,但显然它仍在起作用。其次,ID为ID的MATCH应该只能+NodeByIdSeek访问1个节点,但由于某种原因,它正在执行+AllNodesScan
编码

4

你可以说:

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

这将返回所有类型为User且节点引用ID大于20的节点

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.