Neo4j Cypher Query To C# using 'WITH'
本文关键字:WITH using Cypher Query To Neo4j | 更新日期: 2023-09-27 18:25:15
我想获得有两个帐户的客户,一个是Type1,另一个是Type2。天鹅座查询如下
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;
它有效,但结果不正确
好吧,您的查询是不同的。您的 Cypher 查询有 MATCH
个子句,而您的 Neo4jClient 查询有OPTIONAL MATCH
子句,并且您的节点有不同的名称(帐户、帐户 1、帐户 2、...<->帐户,帐户0,...(。
我建议您确保两个查询相同。您可以使用调试器或使用 query.Query.QueryText
或 query.Query.DebugQueryText
打印生成的 Cypher 查询。在这种情况下query
是你在调用.Results
之前得到的,但你的变量名有点不对劲。
就WITH
而言,With()
方法也可以将string
作为参数,因此您可以简单地编写:
.With("client, account, type")
IMO,采用λ的With()
比采用string
的几乎没有增益,只是噪音更大。
我不能帮助你使用 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