在节点Cypher上添加临时属性

3

是否可以在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上提出的类似问题的响应。


我想返回一个可反序列化为我的模型对象的单个节点。 - F.O.O
尝试返回属性时的绝佳答案。 - F.O.O
这会导致空指针异常,因为它在返回之前被移除了。我的Cypher查询有问题吗? - F.O.O
那没起作用。我以为如果在一个查询中设置和删除,它会平衡一下。问题已更新。 - F.O.O
如果你说 nerrand 是同一件事,那么为什么这个结果让人惊讶呢?你移除了 errand.meta 然后返回 n,意味着 errand.meta 应该是 null。所以如果 meta 是 null,那么返回 meta != null 就会返回 false,这种行为是可以预期的。那么问题出在哪里呢? - FrobberOfBits
显示剩余3条评论
1个回答

1
你的查询根本不需要临时节点属性或特殊变量。(同时,正如@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


您的回答似乎偏离了问题。您能否请看一下如何在Neo4j中为NODE设置临时属性? - F.O.O
这与在Neo4j中创建任意变量完全不同,这是@FrobberOfBits所回答的内容。https://dev59.com/t4fca4cB1Zd3GeqPlaFf - F.O.O
问题的主题是关于临时节点属性,而不是变量——它们是完全不同的东西。此外,问题的第一个链接指向一个与节点属性有关的问题的已接受答案。最后,问题中提供的查询实际上并不需要做任何花哨的事情来获取单个 relationship 值,所以我提供了一个更直接的查询。你是说你整个问题实际上是在问如何设置 meta 属性吗? - cybersam
我已经修改了我的答案,也可以这样做。 - cybersam
一个节点n在数据库中有三个属性。你想要为节点添加第四个临时属性meta,该属性仅在返回的节点中可见,而不在数据库中,我们该如何做? - F.O.O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接