我在将以下 Cypher 查询转换为 Neo4jClient 语法时遇到问题。
MATCH n WHERE NOT (HAS (n.User)) 或 n.User = "username" RETURN n
这是我目前所拥有的,添加了一些关系逻辑并省略了 HAS 逻辑
var results = Client.Cypher
.OptionalMatch("(result)-[connection:Connection]-(result2)")
.Where((Result result) => result.User == username)
.Return((result, connection, result2) => new Neo4jResultSingle()
{
SearchedNode = result.As<Node<Result>>(),
RelationshipConnection = connection.As<RelationshipInstance<Connection>>(),
Relationship = connection.As<RelationshipInstance<ConnectionRelationship>>(),
RelationshipedNode = result2.As<Node<Result>>()
}).Results.ToList();
Run Code Online (Sandbox Code Playgroud)
The*_*nan 10
在Neo4j 4.3中,
用于属性存在检查的 contains() 函数已被弃用,并已被 IS NOT NULL 取代。
所以请使用
MATCH (n)
WHERE n.User IS NOT NULL
RETURN n
Run Code Online (Sandbox Code Playgroud)
或者
MATCH (n)
WHERE n.User IS NULL
RETURN n
Run Code Online (Sandbox Code Playgroud)
具体来说,在您的代码中,
var results = Client.Cypher
.Match("(result)-[connection:Connection]-(result2)")
.Where("WHERE n.User IS NULL OR n.User = {username}")
.WithParams(new { username = username })
.Return((result, connection, result2) => new Neo4jResultSingle()
{
SearchedNode = result.As<Node<Result>>(),
RelationshipConnection = connection.As<RelationshipInstance<Connection>>(),
Relationship = connection.As<RelationshipInstance<ConnectionRelationship>>(),
RelationshipedNode = result2.As<Node<Result>>()
})
.Results
.ToList();
Run Code Online (Sandbox Code Playgroud)
HAS 被取代 EXISTS()
来自最新文档:属性存在检查
MATCH (n) WHERE EXISTS(n.User) RETURN n
Run Code Online (Sandbox Code Playgroud)
对于相反的匹配添加NOT之前
MATCH (n) WHERE NOT EXISTS(n.User) RETURN n
Run Code Online (Sandbox Code Playgroud)
看看您的原始查询和 C# 的组合,也许以下内容可能会有所帮助?
var results = Client.Cypher
.Match("(result)-[connection:Connection]-(result2)")
.Where("WHERE NOT HAS(n.User) OR n.User = {username}")
.WithParams(new { username = username })
.Return((result, connection, result2) => new Neo4jResultSingle()
{
SearchedNode = result.As<Node<Result>>(),
RelationshipConnection = connection.As<RelationshipInstance<Connection>>(),
Relationship = connection.As<RelationshipInstance<ConnectionRelationship>>(),
RelationshipedNode = result2.As<Node<Result>>()
})
.Results
.ToList();
Run Code Online (Sandbox Code Playgroud)
这会重写 WHERE 子句以包含 HAS 和用户名逻辑,同时对其进行参数化以缓存查询计划并防止注入。
| 归档时间: |
|
| 查看次数: |
3593 次 |
| 最近记录: |