Neo4jClient - 如何检查属性是不是存在
Posted
技术标签:
【中文标题】Neo4jClient - 如何检查属性是不是存在【英文标题】:Neo4jClient - How to check if property existsNeo4jClient - 如何检查属性是否存在 【发布时间】:2015-11-12 16:47:36 【问题描述】:我在将以下 Cypher 查询转换为 Neo4jClient 语法时遇到问题。
匹配 n WHERE NOT (HAS (n.User)) OR n.User = "username" 返回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();
【问题讨论】:
您能否发布您尝试转换为 C# 的确切密码查询? 添加HAS逻辑可以写.Where("NOT HAS(n.User)")
【参考方案1】:
HAS
被EXISTS()
取代
来自最新文档:Property existence checking
MATCH (n) WHERE EXISTS(n.User) RETURN n
对于相反的匹配添加NOT
之前
MATCH (n) WHERE NOT EXISTS(n.User) RETURN n
【讨论】:
【参考方案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();
这会重写您的 WHERE 子句以包含 HAS 和用户名逻辑,同时对其进行参数化以缓存查询计划并防止注入。
【讨论】:
以上是关于Neo4jClient - 如何检查属性是不是存在的主要内容,如果未能解决你的问题,请参考以下文章