使用Neo4jClient与.NET Core 6执行Cypher查询报错求助
问题分析与解决
错误根源是你误用了Neo4jClient的链式API:你把包含WITH、UNWIND、RETURN的完整Cypher语句直接传给了Match()方法,之后又调用了.Return(),导致最终生成的查询里出现了两个RETURN子句,违反了Cypher语法规则。
修正方案
拆分原Cypher语句,分别使用Neo4jClient对应的链式方法构建查询:
方式一:直接返回去重后的权限列表
var permissionsList = graphClient.Cypher .Match("(user:User {name: 'bob'})-[:MEMBER_OF]->(group:Group)-[:INHERITS_PERMISSIONS_FROM*0..]->(parent_group:Group)") .With("(parent_group.permissions) + (group.permissions) as permissions") .Unwind("permissions as permissionslist") .ReturnDistinct(permissionslist => permissionslist.As<string>()) .ResultsAsync.Result .ToList();
方式二:保持原聚合返回结构
var resultSet = graphClient.Cypher .Match("(user:User {name: 'bob'})-[:MEMBER_OF]->(group:Group)-[:INHERITS_PERMISSIONS_FROM*0..]->(parent_group:Group)") .With("(parent_group.permissions) + (group.permissions) as permissions") .Unwind("permissions as permissionslist") .Return(() => new { permissions = Return.As<List<string>>("COLLECT(DISTINCT permissionslist)") }) .ResultsAsync.Result .FirstOrDefault();
关键说明
- Neo4jClient的链式API会自动拼接各个子句,不要把完整查询字符串塞给单个方法
- 原代码中
testquery已经包含RETURN,后续调用.Return()会重复添加该子句,触发语法错误 - 两种修正方式都能得到和Neo4j浏览器中一致的权限列表结果
内容的提问来源于stack exchange,提问作者user1424876
相关产品推荐
相关产品推荐

