如何使用neo4j的.net客户端检查两个节点之间是否存在关系
How to check if a relation exists between two nodes using .net client of neo4j
我有一个基于角色的应用程序和 2 个节点 Role
和 Cartable
我正在通过在这两个节点之间创建关系来管理我的权限,如果这两个节点之间存在关系意味着这角色具有查看 Cartable 的权限:
client.Cypher
.Merge("(s:SiteConfiguration)-[:"
+ Relations.ROLE_IN_SITE.ToString()+ "]-(r:Role)-[r1:"
+ Relations.ROLE_HAS_CARTABLE.ToString() + "]->(ca:Cartable)")
.Where("r.Id = {param}").WithParam("param", roleId)
.AndWhere("ca.Id= {param1}").WithParam("param1", cartableId)
.AndWhere("s.SiteId= {param2}").WithParam("param2", MvcApplication.SiteConfigurations.Base.SiteId)
.CreateUnique("(r)-[:" + Relations.EDIT_COMMENT.ToString()+"]-(ca)")
.ExecuteWithoutResults();
现在我想检查两个节点之间是否存在关系,return 一个基于此的布尔值,所以我写了这个:
var q = new CypherFluentQuery(client) as ICypherFluentQuery;
q = q.Match("(s:SiteConfiguration)-[:"
+ Relations.ROLE_IN_SITE.ToString() + "]-(r:Role)-[r1:"
+ Relations.VIEW_CARTABLE.ToString() + "]-(c:Cartable)");
q = q.Where("s.SiteId= {param}").WithParam("param", MvcApplication.SiteConfigurations.Base.SiteId);
q = q.AndWhere("r.Id= {param1}").WithParam("param1", roleId);
q = q.AndWhere("c.Id= {param2}").WithParam("param2", cartableId);
但我不确定我应该 return 在这里,因为 VIEW_CARTABLE
在关系中没有作为匿名对象的任何值。所以我的问题是如何检查这两个节点之间是否存在某种关系?
我认为查看 r1
是否不为空应该就足够了,因为获得非空值的唯一方法是关系是否存在。
因为您使用的是 MATCH
- 如果 r1
不存在,您将不会获得任何结果。如果你知道你会得到 (s)-->(r)
- 但不确定 (r)-->(c)
那么你需要去 OPTIONAL
.
例如(使用 :play Movies
数据库):
var query = gc.Cypher
.Match("(p:Person {name:'Julia Roberts'})")
.OptionalMatch("(p)-[r]->(m:Movie)")
.Where("m.title = 'The Green Mile'")
.Return((p, m) => new
{
Person = p.As<Person>(),
Movie = m.As<Movie>(),
IsInMovie = Return.As<bool>("NOT (r IS NULL)")
});
在这里,我寻找一个人(朱莉娅·罗伯茨),然后试着看看她是否与某部电影有关系——在这种情况下,与我知道她不在的电影有关系。
我使用 OptionalMatch
来执行此操作,然后检查 r
是否为空。
现在,实际上 - 我不需要知道 r
,就好像电影没有 link,m
将是 null
.
在你的情况下,你会将顶部切换为:
var q = new CypherFluentQuery(client)
.Match("(s:SiteConfiguration)-[:ROLE_IN_SITE]-(r:Role)")
.OptionalMatch("(r)-[r1:VIEW_CARTABLE]-(c:Cartable)")
.Where("s.SiteId= {param}").WithParam("param", MvcApplication.SiteConfigurations.Base.SiteId)
.AndWhere("r.Id= {param1}").WithParam("param1", roleId)
.AndWhere("c.Id= {param2}").WithParam("param2", cartableId)
.Return((s,r,c,r1) => new {
Site = s.As<SiteConfiguration>(),
Role = r.As<Role>(),
Cartable = c.As<Cartable>(),
IsCartable = Return.As<bool>("NOT (r1 IS NULL)")
});
您可以检查 IsCartable
是否为 true
或者 Cartable == null
我有一个基于角色的应用程序和 2 个节点 Role
和 Cartable
我正在通过在这两个节点之间创建关系来管理我的权限,如果这两个节点之间存在关系意味着这角色具有查看 Cartable 的权限:
client.Cypher
.Merge("(s:SiteConfiguration)-[:"
+ Relations.ROLE_IN_SITE.ToString()+ "]-(r:Role)-[r1:"
+ Relations.ROLE_HAS_CARTABLE.ToString() + "]->(ca:Cartable)")
.Where("r.Id = {param}").WithParam("param", roleId)
.AndWhere("ca.Id= {param1}").WithParam("param1", cartableId)
.AndWhere("s.SiteId= {param2}").WithParam("param2", MvcApplication.SiteConfigurations.Base.SiteId)
.CreateUnique("(r)-[:" + Relations.EDIT_COMMENT.ToString()+"]-(ca)")
.ExecuteWithoutResults();
现在我想检查两个节点之间是否存在关系,return 一个基于此的布尔值,所以我写了这个:
var q = new CypherFluentQuery(client) as ICypherFluentQuery;
q = q.Match("(s:SiteConfiguration)-[:"
+ Relations.ROLE_IN_SITE.ToString() + "]-(r:Role)-[r1:"
+ Relations.VIEW_CARTABLE.ToString() + "]-(c:Cartable)");
q = q.Where("s.SiteId= {param}").WithParam("param", MvcApplication.SiteConfigurations.Base.SiteId);
q = q.AndWhere("r.Id= {param1}").WithParam("param1", roleId);
q = q.AndWhere("c.Id= {param2}").WithParam("param2", cartableId);
但我不确定我应该 return 在这里,因为 VIEW_CARTABLE
在关系中没有作为匿名对象的任何值。所以我的问题是如何检查这两个节点之间是否存在某种关系?
我认为查看 r1
是否不为空应该就足够了,因为获得非空值的唯一方法是关系是否存在。
因为您使用的是 MATCH
- 如果 r1
不存在,您将不会获得任何结果。如果你知道你会得到 (s)-->(r)
- 但不确定 (r)-->(c)
那么你需要去 OPTIONAL
.
例如(使用 :play Movies
数据库):
var query = gc.Cypher
.Match("(p:Person {name:'Julia Roberts'})")
.OptionalMatch("(p)-[r]->(m:Movie)")
.Where("m.title = 'The Green Mile'")
.Return((p, m) => new
{
Person = p.As<Person>(),
Movie = m.As<Movie>(),
IsInMovie = Return.As<bool>("NOT (r IS NULL)")
});
在这里,我寻找一个人(朱莉娅·罗伯茨),然后试着看看她是否与某部电影有关系——在这种情况下,与我知道她不在的电影有关系。
我使用 OptionalMatch
来执行此操作,然后检查 r
是否为空。
现在,实际上 - 我不需要知道 r
,就好像电影没有 link,m
将是 null
.
在你的情况下,你会将顶部切换为:
var q = new CypherFluentQuery(client)
.Match("(s:SiteConfiguration)-[:ROLE_IN_SITE]-(r:Role)")
.OptionalMatch("(r)-[r1:VIEW_CARTABLE]-(c:Cartable)")
.Where("s.SiteId= {param}").WithParam("param", MvcApplication.SiteConfigurations.Base.SiteId)
.AndWhere("r.Id= {param1}").WithParam("param1", roleId)
.AndWhere("c.Id= {param2}").WithParam("param2", cartableId)
.Return((s,r,c,r1) => new {
Site = s.As<SiteConfiguration>(),
Role = r.As<Role>(),
Cartable = c.As<Cartable>(),
IsCartable = Return.As<bool>("NOT (r1 IS NULL)")
});
您可以检查 IsCartable
是否为 true
或者 Cartable == null