2017-05-16 20 views
0

ASP.NET MVCでNeo4j Clientを使用していますが、初めてこのクエリーを実行したときに日付の範囲内でユーザーイベントを表示するこのクエリがありますイベントを正しく返しますが、イベントを再実行するために私のAjaxを呼び出すと、初めてクエリの2倍のレコードが得られます。私はクエリ行をトレースしていますが、すべてがうまくいっているようですが、私はUnionを初めて使用していると言わなければなりません。Neo4jクエリーで初めて複数のレコードが返される

var q = new CypherFluentQuery(client) as ICypherFluentQuery; 
q = q.Match("(y:Year)--(m:Month)--(d:Day)--(h:Hour)--(sr:ServiceRequest)-[" + Relations.EXPERT_ASSIGN_TO_SQ.ToString() + "]-(u:User)") 
    .Where("y.value >= {param}").WithParam("param", dt1.Year) 
    .AndWhere("m.value >= {param2}").WithParam("param2", dt1.Month) 
    .AndWhere("d.value >= {param4}").WithParam("param4", dt1.Day) 
    .AndWhere("u.Id = {param10}").WithParam("param10", Id) 
    .With("y,m,d,h,sr,u") 
    .Match("(sr)-[:" + Relations.SC_HAS_SQ.ToString() + "]-(c2:ServiceCategory)-[:" + Relations.SC_IS_SC_CHILD.ToString() + "*]-(c3:ServiceCategory)") 
    .ReturnDistinct((y, m, d, h, sr, c2, c3) => new 
    { 
     Year = y.As<RootTree>().value, 
     Month = m.As<RootTree>().value, 
     Day = d.As<RootTree>().value, 
     Hour = h.As<RootTree>().value, 
     serviceRequest = sr.As<ServiceRequest>(), 
     ServiceCategory = c2.As<OnDemandService>(), 
     ServiceParent = c3.As<OnDemandService>() 

    }) 
    .UnionAll() 
    .Match("(yy:Year)--(mm:Month)--(dd:Day)--(hh:Hour)--(sr2:ServiceRequest)-[" + Relations.EXPERT_ASSIGN_TO_SQ.ToString() + "]-(u)") 
    .Where("yy.value <= {param7}").WithParam("param7", dt2.Year) 
    .AndWhere("mm.value >= {param8}").WithParam("param8", dt2.Month) 
    .AndWhere("dd.value >= {param9}").WithParam("param9", dt2.Day) 
    .With("yy,mm,dd,hh,sr2,u") 
    .Match("(sr2)-[:" + Relations.SC_HAS_SQ.ToString() + "]-(c2:ServiceCategory)-[:" + Relations.SC_IS_SC_CHILD.ToString() + "*]-(c3:ServiceCategory)"); 

var query = q.ReturnDistinct((yy, mm, dd, hh, sr2, c2, c3) => new 
{ 
    Year = yy.As<RootTree>().value, 
    Month = mm.As<RootTree>().value, 
    Day = dd.As<RootTree>().value, 
    Hour = hh.As<RootTree>().value, 
    serviceRequest = sr2.As<ServiceRequest>(), 
    ServiceCategory = c2.As<OnDemandService>(), 
    ServiceParent = c3.As<OnDemandService>() 
}).Results.ToList(); 

トレースされたクエリ:

MATCH (y:Year)--(m:Month)--(d:Day)--(h:Hour)--(sr:ServiceRequest)-[EXPERT_ASSIGN_TO_SQ]-(u:User) 
WHERE y.value >= 2017 
AND m.value >= 5 
AND d.value >= 16 
AND u.Id = "c0dc7cbe-5626-4012-a5ea-72c1cfce2461" 
WITH y,m,d,h,sr,u 
MATCH (sr)-[:SC_HAS_SQ]-(c2:ServiceCategory)-[:SC_IS_SC_CHILD*]-(c3:ServiceCategory) 
RETURN distinct y.value AS Year, m.value AS Month, d.value AS Day, h.value AS Hour, sr AS serviceRequest, c2 AS ServiceCategory, c3 AS ServiceParent 
UNION ALL 
MATCH (yy:Year)--(mm:Month)--(dd:Day)--(hh:Hour)--(sr2:ServiceRequest)-[EXPERT_ASSIGN_TO_SQ]-(u) 
WHERE yy.value <= 2017 
AND mm.value >= 5 
AND dd.value >= 9 
WITH yy,mm,dd,hh,sr2,u 
MATCH (sr2)-[:SC_HAS_SQ]-(c2:ServiceCategory)-[:SC_IS_SC_CHILD*]-(c3:ServiceCategory) 
RETURN distinct yy.value AS Year, mm.value AS Month, dd.value AS Day, hh.value AS Hour, sr2 AS serviceRequest, c2 AS ServiceCategory, c3 AS ServiceParent 

更新

私はそれが正しく返す複数回のNeo4j自体にクエリを実行してきたクエリが自分のアプリケーション内で実行する場合、これはのみ発生neo4jClientを使用して

+0

コンソールアプリケーション内でそのコードを2回連続して呼び出すと、2番目のコードでも複数のエントリが返されますか? –

+0

@ChrisSkardonはい。正しく返すのは初めてですが、2回目にもレコードごとに重複するレコードが返されます。 – Valkyrie

+0

@ChrisSkardon問題が見つかりました。これはUNION ALLのためでした.Unionに変更しました'と働いた。 – Valkyrie

答えて

0

実際には私がunion allを使用していたためにシンプルに終了しましたそれはunionにそれは働いた。

関連する問題