繁体   English   中英

Neo4j密码查询到使用WITH的C#

[英]Neo4j Cypher Query To C# using 'WITH'

我想获得拥有两个帐户的客户,一个是Type1,另一个是Type2。 Cygher查询如下


MATCH (client:Client)-[:OWNED_BY]-(account:Account)-[:TYPE_IN]-(type:Type) 
With client, account, type
MATCH (client)-[:OWNED_BY]-(account1:Account)-[:TYPE_IN]-(:Type{accountType: 'Type1'}) 
,(client)-[:OWNED_BY]-(account2:Account)-[:TYPE_IN]-(:Type{accountType: 'Type2'})
RETURN client, account, type

它有效(欢迎任何增强功能,但这不是我的问题)

如何将其转换为C#? 特别是“与客户,帐户,类型”部分。 我有Neo4j.client

我设法做到了


StringBuilder queryString =new StringBuilder();
            StringBuilder addtionQuery = new StringBuilder();

            queryString.Append("(client:Client)-[:OWNED_BY]-(account:Account)-[:TYPE_IN]-(type:Type)");

            addtionQuery.Append(String.Format("(client)-[:OWNED_BY]-(account0:Account)-[:TYPE_IN]-(:Type{{accountType: '{0}'}})"
                , searchCriteria.acctTypes[0]));

            for (int i = 1; i < searchCriteria.acctTypes.Length; i++)
            {
                if (searchCriteria.acctTypes[i] != null)
                {
                    addtionQuery.Append(",");
                    addtionQuery.Append(String.Format("(client)-[:OWNED_BY]-(account{1}:Account)-[:TYPE_IN]-(acct_type{1}:Type{{accountType: '{0}'}})", 
                        searchCriteria.acctTypes[i], i));
                }
            }


var query = Dbclient.Cypher
                .OptionalMatch(queryString.ToString())
                .With((client, account, type) => new 
                {
                    client = client.As<Client>(),
                    type = type.As<Demo1.Models.Type>(),
                    account = account.As<Account>()
                })
                .OptionalMatch(addtionQuery.ToString())
                .Return((client, account, type) => new QueryResult
                {
                    cif = client.As<Client>().cif,
                    type = type.As<Demo1.Models.Type>().accountType,
                    accountId = account.As<Account>().accountId
                })
                .Limit(searchCriteria.limit)
                .Results;

它有效,但结果不正确

我无法通过c#neo4jclient API帮助您,但是您的语句可能会像这样更高效:

MATCH (client:Client)-[:OWNED_BY]-(account:Account)-[:TYPE_IN]-(type:Type) 
WHERE type.accountType IN ['Type1','Type2']
With client, collect([account, type]) as accounts
WHERE size(accounts) > 1
RETURN client, accounts

好吧,您的查询是不同的。 Cypher查询具有MATCH子句,而Neo4jClient查询具有OPTIONAL MATCH子句,并且节点具有不同的名称(account,account1,account2,... <-> account,account0,...)。

我建议您确保两个查询都相同。 您可以使用调试器,也可以使用query.Query.QueryTextquery.Query.DebugQueryText打印生成的Cypher查询。 在这种情况下, query是在调用.Results之前获得的.Results ,但是您的变量名有点过头。

WITH而言, With()方法也可以将string作为参数,因此您可以简单地编写:

.With("client, account, type")

IMO,采用lambda的With()与采用string ,提供的收益很少或没有提供,只是更多的噪音。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM