Neo4jClient - 如何检查属性是否存在

Jef*_*f H 2 neo4jclient

我在将以下 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)


vla*_*ras 5

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)

  • 不再支持属性存在语法“...exists(variable.property)”。请改用“variable.property IS NOT NULL”。 (2认同)

cee*_*eej 2

看看您的原始查询和 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 和用户名逻辑,同时对其进行参数化以缓存查询计划并防止注入。