删除如何在Neo4j中运行?

时间:2018-03-21 11:43:30

标签: neo4j cypher

我的关系名称: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。似乎没什么用。任何人都可以帮我解释语法吗?

3 个答案:

答案 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();

多数民众赞成。

感谢您的回答。