我正在按传出关系的数量排序一个大型数据库。我有一个工作Cypher查询如下:问题利用OrderBy与Neo4jClient
optional match (n)-[r]->(m)
return n, Count(r) as c
order by c DESC limit 1;
Cypher查询正在按预期工作。但是,当我正在调试并逐步完成Cypher - > Neo4jClient转换时,我似乎无法找到问题的根源。
public ReturnPayload[] getByConnections()
{
var query = client.Cypher
.OptionalMatch("(p)-[r]->(m)")
.Return((p, r, m, c) => new
{
p = p.As<Person>(),
pid = (int)p.Id(),
e = r.As<RelationshipInstance<Object>>(),
m = m.As<Metadata>(),
c = r.Count()
}).OrderByDescending("c").Limit(1);
var res = query.Results;
var payload = new List<ReturnPayload>();
foreach (var el in res)
{
var t = new ReturnPayload();
t.e = el.e;
t.m = el.m;
t.pid = el.pid;
t.p = el.p;
payload.Add(t);
}
return payload.ToArray<ReturnPayload>();
}
我怀疑问题的一部分,可能是我没有利用CollectAs<T>()
,因此它指的“1”的计数每每个人。不幸的是,我试图使用CollectAs<T>()
和CollectAsDisctinct<T>()
,我的结果JSON体系结构只是将每个单独的元素封装在一个数组中,而不是将相同的元素聚合到一个数组中。
FOREACH
循环有助于从匿名类型转换为我的相对标准的<ReturnPayload>
,它不使用参数中的c
对象。
您的时间表示感谢,谢谢。
调试好的查询测试:
OPTIONAL MATCH (p)-[r]->(m)
RETURN p AS p, id(p) AS pid, r AS e, m AS m, count(r) AS c
ORDER BY c DESC
LIMIT {p0}
而我的 '功能' 的Cypher查询:
optional match (n)-[r]->(m)
return n, Count(r) as c
order by c DESC limit 1;
您可以根据https://github.com/Readify/Neo4jClient/wiki/cypher#debugging提取调试查询文本,并与您的预期/正在运行的查询进行比较吗? – 2014-12-01 21:26:47
@TathamOddie:我的不好。编辑到最初的帖子的底部。 – Kyle 2014-12-01 21:36:29
@ThamhamOddie:在Cypher窗口中运行调试查询会导致数据不正确(逻辑上没有代码错误)。所以Cypher查询是有效的,但我的Cypher构造不是。 – Kyle 2014-12-01 21:50:13