c#neo4j密码使用正则表达式
本文关键字:正则表达式 密码 c#neo4j | 更新日期: 2023-09-27 18:23:56
我将Neo4j
图形DB与Neo4jClient
一起使用我正在尝试对节点执行搜索查询,结果应该返回包含给定查询字符串的节点列表。
我有这个工作,但它似乎效率很低,因为我把所有的Groups
都带回来,然后过滤。有更好的方法吗?
internal object SearchGroups(string query)
{
var groups = WebApiConfig.GraphClient.Cypher
.Match("(g:Groups)")
.Return(g => g.As<Groups>())
.Results;
List<Groups> groupList = new List<Groups>();
foreach (var item in groups)
{
if (item.GroupName.Contains(query))
{
groupList.Add(item);
}
}
return groupList;
}
我看到过使用.Where((Groups g)=> g.GroupName == query)
进行筛选的示例但这仅在匹配时返回,而不是在Contains
时返回。
好吧,你主要使用regex
标签-根据你想做什么和你的query
是什么,你有两个选项。首先-请阅读Cypher
的文档,并首先在Admin窗口(localhost:7474)中尝试查询,你会发现这非常有益。尤其是Where
文档会对您有很大帮助。
选项1:Regex
var groups = WebApiConfig.GraphClient.Cypher
.Match("(g:Groups)")
.Where("g.GroupName =~ {nameParam}")
.WithParam("nameParam", string.Format(".*{0}.*", query))
.Return(g => g.As<Groups>())
.Results;
Cypher看起来像:
MATCH (g:Groups) WHERE g.GroupName =~ '.*<your query text>.*' RETURN g
这是使用regex
-作为参数,其工作方式与Contains
相同。像这样使用regex
不是一种性能,如果你能做一些像…这样的事情可能会更好。。。。
选项2:从开始
这仅适用于如果您使用的是Neo4j 2.3+
并且query
是Starts With
类型的查询,但速度会快得多。
var groups = WebApiConfig.GraphClient.Cypher
.Match("(g:Groups)")
.Where((Groups g) => g.GroupName.StartsWith(query))
.Return(g => g.As<Groups>())
.Results;
Cypher看起来像:
MATCH (g:Groups) WHERE g.GroupName STARTS WITH <your query text> RETURN g
PS
你真的应该从你的方法中返回IEnumerable<Groups>
/ICollection<Groups>
/IList<Groups>
,而不是object
,你也可以用:替换你的foreach
var groupsList = groups.Where(g => g.GroupName.Contains(query)).ToList();
或者直接退回:
return groups.Where(/*see above*/);