2014-08-29 127 views
3

所以我知道当你创建节点时,neo4j为每个节点都有一个UUID。我知道你可以通过访问该ID来访问该UUID的特定节点。例如:如何获得在neo4j中创建的最后一个节点?

START n=node(144) RETURN n;

我怎么会得到所创建的最后一个节点?我知道我可以显示所有节点,然后使用相应的ID在anotehr查询中运行相同的命令,但有没有办法快速执行此操作?我可以通过id命令节点并限制1吗?有一种更简单的方法吗?无论哪种方式,我还没有想通过一个简单的密码查询如何做到这一点。

回答

4

每次不能保证新的节点总是比所有以前创建的节点更大的ID,

所以最好的方法是设置在创建节点存储当前时间戳created_at属性。 您可以使用时间戳()函数来存储当前时间戳

然后,

Match (n) 
Return n 
Order by n.created_at desc 
Limit 1 
-1

我终于找到答案。该ID()函数将返回Neo4j的ID为节点:

Match (n) Return n Order by ID(n) desc Limit 1;

+1

并非总是如此.. 因为节点ID可以改变 – 2015-06-20 11:07:04

2

请注意,Neo4j的内部节点ID不是UUID。也不保证新节点总是具有比以前创建的所有节点更大的ID。节点ID是(乘以某个常量)存储文件内节点位置的偏移量。由于空间回收,新节点可能会获得较低的ID号。

BIG FAT警告:不要对节点id做任何假设。

根据您的要求,您可以将所有节点组织到链接列表中。有一个具有特定标签的“魔术”节点,例如, References这一直到最新创建的节点的关系:

CREATE (entryPoint:Reference {to:'latest'}) // create reference node 

在创建从您的域的节点,需要采取多种措施:

  1. 删除latest关系,如果存在的话
  2. 创建您的节点
  3. 将您的新节点连接到先前的最新节点
  4. 创建参考链接

MATCH (entryPoint:Reference {to:'latest'})-[r:latest]->(latestNode) 
CREATE (domainNode:Person {name:'Foo'}), // create your domain node 
(domainNode)-[:previous]->(latestNode), // build up a linked list based on creation timepoint 
(entryPoint)-[:latest]->(domainNode) // connect to reference node 
DELETE r //delete old reference link