Neo4j查询转ASP.NET查询无结果问题技术求助
解决ASP.NET中Neo4jClient Cypher查询无结果的问题
嘿,我一眼就看出来问题出在哪了——你在Neo4j里直接跑的Cypher语句没问题,但移植到ASP.NET的Neo4jClient代码时,Where条件的写法完全跑偏了,导致查询逻辑根本不对!
先给你拆解错误根源:
你原始的Cypher用=~ ".*Relational.*"做正则模糊匹配,但在Lambda表达式里写p.Name == "~.*Relational.*",这相当于让Neo4j去匹配**精确等于字符串~.*Relational.***的Paper名称,而不是执行正则匹配,当然查不到任何结果啦。
下面给你两种修正方案,选你顺手的来用:
方案一:直接使用Cypher字符串条件(最直观)
这种方式和你原始的Cypher写法最接近,直接把正则匹配的条件写成字符串传给Where方法:
var temp = QueryManager.c.Cypher .Match("(auth:Author)-[writes]->(p:Paper)") .Match("(p:Paper)-[publish]->(j:Journal)") .Match("(j:Journal)-[held]->(y:Year)") .Where("p.Name =~ '.*Relational.*'") // 改用Cypher原生的正则匹配语法 .Return((auth, p, j, y) => new { author_detail = auth.As<Author>(), paper_detail = p.As<Paper>(), jour_detail = j.As<Journal>(), year_detail = y.As<Year>() });
方案二:用Lambda表达式结合正则方法
如果你更习惯Lambda的写法,可以用Regex.IsMatch,Neo4jClient会自动把这个方法调用转换成Cypher的=~正则匹配语法:
// 记得先引用正则命名空间 using System.Text.RegularExpressions; var temp = QueryManager.c.Cypher .Match("(auth:Author)-[writes]->(p:Paper)") .Match("(p:Paper)-[publish]->(j:Journal)") .Match("(j:Journal)-[held]->(y:Year)") .Where((Paper p) => Regex.IsMatch(p.Name, ".*Relational.*")) // 通过Regex.IsMatch实现正则匹配 .Return((auth, p, j, y) => new { author_detail = auth.As<Author>(), paper_detail = p.As<Paper>(), jour_detail = j.As<Journal>(), year_detail = y.As<Year>() });
另外还要提一句:你原始的Cypher里没有匹配Author的逻辑,但ASP.NET代码里加了(auth:Author)-[writes]->(p:Paper)的Match。如果你的数据里存在没有关联Author的Paper,这部分Match会过滤掉那些Paper,导致结果变少甚至为空。如果不需要Author数据,建议去掉这个Match,和原始Cypher保持一致;如果确实需要Author信息,要确保所有目标Paper都有对应的Author节点和writes关系哦。
内容的提问来源于stack exchange,提问作者Ramiz
相关产品推荐
相关产品推荐

