返回具有未知查询时结构的节点,使用"计算"物业增加?

时间:2015-12-23 04:17:01

标签: neo4j cypher

我需要返回节点及其ID,并且应避免这样的事情:

RETURN n, ID(n) as n_ID

我非常希望能够将ID 返回 a"计算"节点的属性,以便客户端看到节点好像它有一个名为id的属性。

我现在已经打了几个小时。我找到的最近的是this comment under an unsatisfying answer to a similar question

MATCH (n:Person) RETURN { id: ID(n), name: n.name } as user

该方法没用,因为它需要手动将节点重建为RETURN子句中的映射文字。如果您不知道所有属性名称,这是不可能的,这将是我的应用程序中的典型场景;另外,可能有很多的属性。

我接下来尝试的是运营商' +'。它会引发类型不匹配;你不能用这种方式将Map与Node结合起来。我找不到任何记录的方式将节点转换为地图。文档提到了KEYS(),但没有提到VALUES(),也没有提到" zip"键和值到地图中。

我想到的另一件事:

REDUCE(theMap = {id: ID(n)}, k in KEYS(n) | theMap + { what? : what? })

...但我不知道如何做一个"变量键"在数组文字中,以及如何通过变量键访问节点的属性。

我想在密码中尽力做什么?

2 个答案:

答案 0 :(得分:0)

您可以在id节点之后(并在同一事务中)添加CREATE属性。例如:

CREATE (n:Person {name: "Fred", address: "123 Main St"})
SET n.id = ID(n)
RETURN n;

这样,您的节点实际上会有一个id节点 - 以后不需要计算它。

答案 1 :(得分:0)

根据您使用id执行的操作,您可能需要重新考虑返回Neo4j节点ID(内部标识),而是在每个节点上生成并存储UUID属性。内部节点ID可以重复使用,不应用于引用外部系统中的节点。内部ID表示存储文件中的偏移量,如果删除节点,则可以填充存储文件中的这些间隙,回收已使用的ID。

有一个插件here可以自动创建UUID并讨论Github here