【问题标题】:Add a Temporary Property on a Node Cypher在节点密码上添加临时属性
【发布时间】:2015-05-13 18:51:48
【问题描述】:

是否可以在节点上设置属性并在单个密码查询中将其删除,而不会导致 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());

返回假。

答案在 Neo4J create temp variable within Cypher 适用于节点?

我目前在 Neo4j 的嵌入式模式下使用 Neo4j,我的查询是使用 Neo4jTemplate 类运行的。

查看我在Set a transient property on a node neo4j就这个问题提出的类似问题的回复

【问题讨论】:

  • 我想将一个可反序列化的节点返回到我的模型对象中
  • 尝试返回属性时的最佳答案。
  • 这会导致空指针异常,因为它在返回之前已被删除。我的密码查询有问题吗?
  • 改写我的问题
  • 请更新问题以显示根据该查询填充 Errand 对象的代码。您是否尝试过不绑定 n 两次,一次绑定到自身,一次绑定到 WITH 块中的 errand

标签: neo4j cypher spring-data-neo4j


【解决方案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 中的节点上设置临时属性?
  • 这与在 Neo4j 中创建任意变量完全不同,@FrobberOfBits 回答 stackoverflow.com/questions/28375229
  • 问题的主题是关于临时节点属性,而不是变量——它们是完全不同的东西。此外,问题的第一个链接指向一个问题,其接受的答案与节点属性有关。最后,问题中提供的查询实际上不需要做任何花哨的事情来取回单个relationship 值,因此我提供了更直接的查询。您是说您的整个问题实际上是在询问如何设置 meta 属性?
  • 我已经修改了我的答案来做到这一点。
  • 一个节点 n 具有三个持久化在数据库中的属性。您想向节点添加第四个临时属性元,该属性仅在返回的节点中可见,但在数据库中不可见,我们该怎么做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
相关资源
最近更新 更多