我的关系名称:RELTYPE
包含名为LineIds
的属性数组。
假设,
(node1)-[r:RELTYPE {LineIds : [1,2,15]}]->(node2)
我想从r.LineIds
数组中删除一个非常具体的值(让我们说15)。
编写的代码似乎不起作用。我想删除" 15"来自r.LineIds
数组。
var lineId = 15
var match = "(t:Template)-[r1:DEPENDS_ON]->(e:Template)"
this.client.Cypher.Match(match)
.Where((Template t) => t.Id == this.source.Id && t.ScenarioId == sid1)
.AndWhere((Segment e) => e.Id == this.dest.Id)
.Remove(lineId+" In r.LineIds")
.ExecuteWithoutResults();
在Neo4j浏览器中
match (b :Template)-[r:Temp_Reffered_DIM_SEG1]->(dim2 :Natural_Account)
where b.Id = 228 and b.ScenarioId = 200 and dim2.Id =117
remove 15 in r.LineIds
delete 15
我还尝试了[15]而不是仅仅删除了15。似乎没什么用。任何人都可以帮我解释语法吗?
答案 0 :(得分:1)
您遇到麻烦并不奇怪,Cypher无法选择性地从列表中删除项目。但是您可以将列表替换为已过滤掉值的列表。
只有Cypher,你可以这样做:
match (b :Template)-[r:Temp_Reffered_DIM_SEG1]->(dim2 :Natural_Account)
where b.Id = 228 and b.ScenarioId = 200 and dim2.Id =117
set r.LineIds = filter(val in r.LineIds where val <> 15)
如果您可以访问APOC程序,那么可以使用它更容易:
match (b :Template)-[r:Temp_Reffered_DIM_SEG1]->(dim2 :Natural_Account)
where b.Id = 228 and b.ScenarioId = 200 and dim2.Id =117
set r.LineIds = apoc.coll.removeAll(r.LineIds, [15])
答案 1 :(得分:0)
正如您可以看到neo4j的开发人员手册,其中list operations remove不是用于列表的函数,而是用于remove节点的属性/标签。
答案 2 :(得分:0)
我终于明白了。
过滤掉我想删除的值是对我有用的解决方案之一。
下面的查询工作正常。
match (b :Template)-[r:Temp_Reffered_DIM_SEG1]->(dim2 :Natural_Account)
where b.Id = 228 and b.ScenarioId = 200 and dim2.Id =117
Set r.LineIds = filter(x in r.LineIds where not(x=15))
从.net类调用Neo4j DB的代码
var lineId = 15
var match = "(t:Template)-[r1:DEPENDS_ON]->(e:Template)"
this.client.Cypher.Match(match)
.Where((Template t) => t.Id == this.source.Id && t.ScenarioId == sid1)
.AndWhere((Segment e) => e.Id == this.dest.Id)
.Set(string.Format("r.LineIds = filter(x in r.LineIds where not(x={0}))",lineId))
.ExecuteWithoutResults();
多数民众赞成。
感谢您的回答。