2017-05-15 89 views
0

我试图用Neo4JClient替换现有的节点。我对Neo4j还是比较新鲜,所以我不确定我是否正确地做到了这一点。查询应该将现有节点上的所有属性更新为新节点的属性。Neo4j:替换现有节点

public static Node<VitalSignEvent> MergeVitalSignEvent(VitalSignEvent mergedEvent) 
    { 

     try 
     { 
      vsNode = DBUtils.DBService.Cypher 
       .Merge($"(evt:VitalSignEvent {{ItemId: {mergedEvent.ItemId}, DateObserved: {mergedEvent.DateObserved} }})") 
       .OnMatch() 
       .Set("evt = merged") 
       .WithParam("merged", mergedEvent) 
       .Return(evt => evt.As<Node<VitalSignEvent>>()) 
       .Results.FirstOrDefault(); 
     } 
     catch (Exception e) 
     { 
      LogException(nameof(MergeVitalSignEvent), e); 
     } 
     return vsNode; 
    } 
+1

目前尚不清楚你正在尝试做什么。你能提供更多细节吗?只有当具有相同模式的现有节点尚不存在时,您的代码才会创建新节点,并返回第一个现有匹配节点或新节点。 “更新”和“替换”都没有完成。 – cybersam

+0

@cybersam希望它更新现有节点。如果任何属性不同,它应该得到新节点的值。 –

+0

但还没有“新”节点。如果匹配节点尚不存在,您是否尝试创建新节点?你是否想使用'mergedEvent.ItemId'作为查找现有节点的“键”,或者是否要将'mergedEvent.ItemId'和'mergedEvent.DateObserved'一起用作关键字? – cybersam

回答

1

您应该删除OnMatch()调用,因为您要设置新创建的节点以及现有节点上的属性。

 vsNode = DBUtils.DBService.Cypher 
      .Merge($"(evt:VitalSignEvent {{ItemId: {mergedEvent.ItemId}, DateObserved: {mergedEvent.DateObserved} }})") 
      .Set("evt = $merged") 
      .WithParam("merged", mergedEvent) 
      .Return(evt => evt.As<Node<VitalSignEvent>>()) 
      .Results.FirstOrDefault();