是否可以在节点上设置属性并在单个cypher查询中删除它,而不会在Neo4j中导致实际的磁盘写入。
例如,我尝试使用n作为差事复制此查询中的n节点,但是差事上的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 single = template.query(q, null).to(Errand.class).singleOrNull();
System.out.println (single.isMetaSet());
返回false。
是答案吗? Neo4J create temp variable within Cypher适用于节点?
我目前正在使用Neo4j在嵌入式模式下使用Neo4j,我的查询使用Neo4jTemplate类运行。
上就此问题提出的类似问题的回复答案 0 :(得分:0)
您的查询根本不需要临时节点属性或特殊变量。 (另外,正如@FrobberOfBits所说,你的方法存在缺陷。)
以下查询会删除errand
(这只是n
节点的别名),还会设置n.meta
属性:
MATCH (owner)-[:POSTED]->n
SET n.meta =
CASE WHEN owner-[:RECOMMENDED]->n THEN 'BROADCASTED'
WHEN owner-[:POSTED]->n THEN 'POSTED'
WHEN owner-[:GOT_NOMINATED]->n THEN 'NOMINATED'
ELSE 'CONNECTED'
END
RETURN n.meta LIMIT 1
(由于您限制为1,因此无需使用DISTINCT
。)