是否可以在Neo4j中使用单个cypher查询设置节点属性并删除它,而不会导致实际的磁盘写入?
例如,我尝试在此查询中使用n作为errand来复制n节点,但对errand进行的SET会导致对n进行SET,同样的REMOVE操作也会使该属性在返回值中丢失。
这是我创建节点上临时属性的尝试。
String q = "MATCH (owner)-[:POSTED]->n WITH owner, n, n as errand,
CASE WHEN owner-[:RECOMMENDED]->n THEN 'BROADCASTED'
WHEN owner-[:POSTED]->n THEN 'POSTED'
WHEN owner-[:GOT_NOMINATED]->n THEN 'NOMINATED'
ELSE 'CONNECTED'
END AS relationship
SET errand.meta = relationship
REMOVE n.meta
RETURN errand LIMIT 1";
然而,每当我检查我的域对象以查看Neo4j是否设置了属性时,它返回null。
public class Errand {
private String meta;
Boolean isMetaSet () {
return meta != null;
}
}
使用SDN Neo4j,我获取我的errand对象如下:
Errand single = template.query(q, null).to(Errand.class).singleOrNull();
System.out.println (single.isMetaSet());
返回false。
这个答案适用于节点吗?详情请参见Neo4J create temp variable within Cypher。
我目前在使用Neo4j嵌入式模式,使用Neo4jTemplate类运行查询。
关于此问题,您可以查看我在Set a transient property on a node neo4j上提出的类似问题的响应。
n
和errand
是同一件事,那么为什么这个结果让人惊讶呢?你移除了errand.meta
然后返回n
,意味着errand.meta
应该是 null。所以如果 meta 是 null,那么返回 meta != null 就会返回 false,这种行为是可以预期的。那么问题出在哪里呢? - FrobberOfBits