WHERE 子句中的 Lambda 表达式未按预期工作
Posted
技术标签:
【中文标题】WHERE 子句中的 Lambda 表达式未按预期工作【英文标题】:Lambda expression in WHERE clause not working as expected 【发布时间】:2013-08-24 22:47:30 【问题描述】:我是 Neo4j 的新手,并尝试在 where 子句中使用 lambda 表达式进行简单的 Cypher 查询,但由于某种原因,我似乎无法弄清楚为什么这不起作用。
看起来像:
class HealthNode
public string Nameget;set;
//Other Stuff
string Name = "Foobar";
var query = client
.Cypher
.Start(new n = Neo4jClient.Cypher.All.Nodes )
.Where((HealthNode n) => n.Name == Name)
.Return<HealthNode>("n");
如果我转储我得到的文本和参数:
START n=node(*)
WHERE (n.Name! = p0)
RETURN n
//P0 Foobar
当我执行这个时,我当然会得到:
Cypher does not support != for inequality comparisons. Use <> instead
为什么要在变量名后面加上一个感叹号?
【问题讨论】:
【参考方案1】:!
表示如果该属性不存在,则结果将为 false。因此,如果您在图中有多个类型,而其他类型没有“名称”属性,neo4j 将不会进行匹配。
请参阅Neo4J Documentation 了解更多信息。
至于收到 != 警告,您是否在粘贴时更改了查询?重新格式化?如果我这样做,我会收到同样的警告:
WHERE (n.Name != p0)
但不会收到任何警告,如果我使用则成功完成:
WHERE (n.Name! = p0)
【讨论】:
我使用复制/粘贴来获取确切的文本。 你要粘贴到哪里?只要!
和=
之间有空格,就不会出现错误。如果您在密码控制台中运行此查询:START n=node(0) WHERE n.Name! = "TEST" RETURN n;
,是否会显示相同的错误?
我使用复制/粘贴来获取确切的文本,我还亲自到 shell 本身输入它以防万一有隐藏字符,但解析器返回相同的错误。 (很抱歉格式不好,我还没有掌握这个网站的窍门)START n=node(*) WHERE (n.Name! = "FOO") RETURN n;
在我的本地服务器上返回错误(2.0.0-M04 Windows 社区)奇怪的是,如果我执行相同的查询运行良好它针对 [neo4j.org/learn/try] 上的实时示例数据库我想知道这是否是 Windows 版本中此特定版本的解析器中的错误?
很好,网上的样本大概运行的是稳定版 1.9x 而不是 2.0【参考方案2】:
我想我在这里找到了问题的原因:
对默认实现 NULL IF 的 2.0 解析器进行了更改(而不是在缺少的属性上返回错误)并删除 !和 ?运营商,因为他们不再做任何事情。
neo4j pull request 1014 我怀疑这会破坏很多东西,而不仅仅是 Neo4J 客户端。
【讨论】:
【参考方案3】:在 Neo4jClient 1.0.0.625 及更高版本中与 Neo2j 2.0 对话时已修复。
【讨论】:
以上是关于WHERE 子句中的 Lambda 表达式未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
来自不同类的 Lambda 表达式中的多个 Where 子句