【问题标题】:update relationship between two nodes if one exists, or create a new relationship if one does not already exist NEO4j更新两个节点之间的关系,如果一个存在,或者如果一个不存在,则创建一个新的关系 NEO4j
【发布时间】:2018-10-11 11:04:27
【问题描述】:

我想写一个查询;

  • 更新两个节点之间的关系,如果一个已经存在,或者
  • 如果不存在关系,则在两个节点之间创建一个。

实际上,这是允许程序的一个用户“阻止”该程序的另一个用户,而不管这两个用户之前是否有任何类型的关系(可能有任意数量的关系)。 对于查询的一半,如果存在关系,则可选择返回关系;

MATCH (a:user {name: {aParam}) 
OPTIONAL MATCH (a) -[r]- (b:user {name: {bParam}) 
RETURN type(r), a

对于查询的另一半,更新两个节点之间的关系(假设它已经存在);

MATCH (a:user {name: {aParam}) <- [r:originalRelationship] - (b:user {name: {bParam})
WITH a, r, b
MERGE (a) - [:updatedRelationship] - (b)
WITH r
DELETE r

但是将两者结合起来,我还没有生成一个可行的例子,我尝试将它们结合在一起,但科学怪人并没有出现;

MATCH (a:user {name: {aParam})
OPTIONAL MATCH (a) - [r] - (b:user {name: {bParam})
WITH a, b, r
MERGE (a) - [:block] -> (b)
WITH r
DELETE r

有人可以在这里指出我的错误并指出正确的方向吗?

【问题讨论】:

  • Neo.DatabaseError.General.UnknownError: org.neo4j.values.storable.NoValue 不能转换为 org.neo4j.values.virtual.NodeValue 我得到错误

标签: neo4j cypher


【解决方案1】:

由于您涉及多个关系,并且您希望删除所有现有关系并将其替换为 Blocked,您可以尝试以下操作:

Match (p1:Person{name:"hj"}),(p2:Person{name:"bg"})
OPTIONAL Match (p1)-[r]->(p2) where TYPE(r)<>"Blocked"
MERGE (p1)-[:Blocked{blocked: True}]->(p2)
DELETE r
return *

保留以下部分以防它对某人有所帮助。如果您只有一种类型的关系,并且只想更新值,则可以使用:

您可以将 Merge 子句与 ON MATCHON CREATE 选项结合使用。

由于你没有明确指定节点和关系结构,我再举一个例子。 考虑 2 个 Person 节点,其中字段“name”唯一标识该人。

如果不存在,则查询创建关系,如果已经存在,则可以指定要更新的字段。

Match (p1:Person{name:"hj"}),(p2:Person{name:"bg"})
Merge (p1)-[r:originalRelationship]->(p2)
ON CREATE SET r.created = True
ON MATCH SET r.updated = True
return p1,p2,r

【讨论】:

  • 对不起,我更新了我的问题以澄清。节点具有相同的类型/标签。任何两个节点之间最多可以有 1 个关系,但是这种关系可以是各种类型的,或者两个节点之间当然可以完全没有关系。
  • 我认为这不能回答我的问题,我的问题是创建一个从一个节点到另一个节点的“阻塞”关系,如果之前两个节点之间没有关系,或者如果一个节点之间没有关系,则删除原始关系存在并将其替换为“阻塞”关系
  • @user74091 请检查更新后的答案,看看是否适合您。它删除创建“块”关系,并应删除所有其他关系(如果存在)。
  • 好的,我需要的,等我回到我的电脑上试试
  • 您在被阻止的关系中包含了一个属性,{blocked: True},这是必需的还是偏好?你能评论一下这里的属性的使用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
相关资源
最近更新 更多