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+您的queryStarts 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*/);