2017-11-13 2 views
1

ソフトウェアシステムには組織とアプリケーションがあります。ユーザーアクションによってログレコードが生成されます。ログレコード(緑色)は組織(赤色)に属し、アプリケーション(ピンク色)に属することがあります。サイファーが行うノードだけを返すので、私は2つのCASE表現を使用ノードがオプションの関係を持つクエリを最適化することは可能ですか?

MATCH 
(log0:Log)-[:GENERATED_IN]->(org:Organization), 
(app:Application)<-[:GENERATED_IN]-(log1:Log)-[:GENERATED_IN]->(org:Organization) 
WHERE ($orgID IS NULL 
    OR ID(org)=$orgID) 
AND ($appID IS NULL 
    OR ID(app)=$appID) 
RETURN DISTINCT 
    CASE $appID 
     WHEN null THEN log0 
     ELSE log1 
    END 
    CASE $appID 
    WHEN null then log1 
    ELSE null 
    END 

:(両方のparamsはオプション)アプリケーションと組織によってノードをフィルタリングしようと

Neo4j DB model

は、私は、次のクエリを作成しました:Organizationとの関係はlog0(ただし、すべて:Logノードが返されると予想していましたが)、CASEからいくつかの変数を返す可能性がないため、i。 e。

RETURN DISTINCT 
    CASE $appID 
     WHEN null THEN log0, log1 
     ELSE log1 

これはきれいに読みやすく、保守性コード(心の中でESP。キープ私は現在、簡単にするために除外他のフィルタリングのparamsが多い)ではないようなので、このクエリを最適化するために、任意の可能性はありますか?

+0

「ESPを念頭に置いて、私は現在、簡単にするために除外他のフィルタリングのparamsがたくさんある。」 - これらのparamsは、同じノードをフィルタリングするか、またはそれらすべてが(appID、orgIDなどと同様に)別のノードをフィルタリングします。 –

+0

@GaborSzarnyasそれらのうちのいくつかは ':Log'プロパティ(作成時、名前変更時のテキスト)にフィルタをかけ、他のノードとの関係に基づいてフィルタリングします(':User'への変更の著者、 ':Permission' nodes) – Polyakoff

答えて

1

このような1つのまたは2 Logノードを含むマップを、返すことができますあなたのクエリ:

MATCH 
    (log0:Log)-[:GENERATED_IN]->(org:Organization), 
    (app:Application)<-[:GENERATED_IN]-(log1:Log)-[:GENERATED_IN]->(org) 
WHERE ($orgID IS NULL OR ID(org)=$orgID) 
    AND ($appID IS NULL OR ID(app)=$appID) 
RETURN DISTINCT 
    CASE $appID WHEN NULL 
    THEN {a: log0, b: log1} 
    ELSE {a: log1} 
    END AS result; 
+1

いくつかの_cases_では、リストを返すこともでき、それはさらに短くなります:' CASE $ appID WHEN NULL THEN [] ELSE [log0] END + [log1] AS result' –

関連する問題