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时返回。

c#neo4j密码使用正则表达式

好吧,你主要使用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+并且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

你真的应该从你的方法中返回IEnumerable<Groups>/ICollection<Groups>/IList<Groups>,而不是object,你也可以用:替换你的foreach

var groupsList = groups.Where(g => g.GroupName.Contains(query)).ToList();

或者直接退回:

return groups.Where(/*see above*/);