在节点Cypher上添加临时属性

时间:2015-05-13 18:51:48

标签: neo4j cypher spring-data-neo4j

是否可以在节点上设置属性并在单个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类运行。

请参阅我在Set a transient property on a node neo4j

上就此问题提出的类似问题的回复

1 个答案:

答案 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。)