c# neo4j cypher 使用正则 exp
c# neo4j cypher use regular exp
我将 Neo4j
图形数据库与 Neo4jClient
一起使用
我正在尝试对节点执行搜索查询,结果应该是 return 包含给定查询字符串的节点列表。
我有这个工作,但它似乎效率低下,因为我将所有 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)
过滤的示例
但这只有 return 匹配,而不是 Contains
。
好吧,你大部分时间都带有 regex
标签 - 你有 2 个选项,具体取决于你想做什么,以及你的 query
是什么。首先 - 请 阅读文档 Cypher
and try your queries out in the Admin window (localhost:7474) first, you'll find it hugely beneficial. In particular for this the Where
文档会对你有很大帮助。
选项 1:正则表达式
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
你真的应该 return IEnumerable<Groups>
/ICollection<Groups>
/IList<Groups>
从你的方法而不是 object
,你也可以替换你的 foreach
与:
var groupsList = groups.Where(g => g.GroupName.Contains(query)).ToList();
或者只是return它:
return groups.Where(/*see above*/);
我将 Neo4j
图形数据库与 Neo4jClient
一起使用
我正在尝试对节点执行搜索查询,结果应该是 return 包含给定查询字符串的节点列表。
我有这个工作,但它似乎效率低下,因为我将所有 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)
过滤的示例
但这只有 return 匹配,而不是 Contains
。
好吧,你大部分时间都带有 regex
标签 - 你有 2 个选项,具体取决于你想做什么,以及你的 query
是什么。首先 - 请 阅读文档 Cypher
and try your queries out in the Admin window (localhost:7474) first, you'll find it hugely beneficial. In particular for this the Where
文档会对你有很大帮助。
选项 1:正则表达式
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
你真的应该 return IEnumerable<Groups>
/ICollection<Groups>
/IList<Groups>
从你的方法而不是 object
,你也可以替换你的 foreach
与:
var groupsList = groups.Where(g => g.GroupName.Contains(query)).ToList();
或者只是return它:
return groups.Where(/*see above*/);