次のグラフ構造またはクエリのいずれかを改善してパフォーマンスを向上させるための提案はありますか?理想的には、私はこれをサブ1sに持っていきたいと思います。今すぐ最高の私は約2Mのノードと10Mのrels以上7MのDBのヒットで〜8Sを得ることができます。複数のリレーションシップまたは複数のラベルを持つ一意のノード間での集計の実行
私は
(co:Company)<-[:HAS_PROVIDER]-(c:Customer)-[:HAS_CLAIM]->(c:Claim)
- 各請求項は、「量」とは、各企業が名前を持って
- いわゆる「直接」のブールプロパティだけでなく、プロパティを持つ構造をグラフ持っ
- お客様は複数のクレームを持つことができますが、会社は1つだけです
私はショーのことができるようにするには、NT:
- 個別の会社名の直接の会社真=直接請求の
- 数
- 量の合計真=直接請求のための
- 数について
- 顧客数達成するために=虚偽の主張
- 直接=虚偽の請求額の合計
これは、私は2つのアプローチを使用しました:a)請求項ために顧客からの関係を作成し
どこダイレクト=真のように:IS_DIRECTと直接= falseのように:IS_INDIRECTB)として、各ダイレクト=真の主張をラベル:DirectClaimノードおよびdirect = falseクレーム:InDirectClaimノード
(a)を使用すると、rels TYPEのフィルタで会社名、顧客数、サイズ(IS_DIRECT)およびサイズ(IS_INDIRECT)を取得できます。ただし、抽出、フィルター、組み合わせの組み合わせを使用して合計(量)を取得すると、構成に関係なくタイムアウトになります。
使用して(b)は動作しますが、10秒
EDIT〜とります。(a)のように見えるため
クエリ
MATCH (co:Company)<-[:HAS_PROVIDER]-(c)-[r:IS_DIRECT|IS_INDIRECT]->(cl)
WITH distinct co, collect(r) as rels, count (distinct c) as cntc, collect(mc) as claims
WITH co, cntc,
size(filter(r in rels WHERE TYPE(r) = 'IS_DIRECT')) as dcls,
size(filter(r in rels WHERE TYPE(r) = 'IS_INDIRECT')) as indcls,
REDUCE
(s = {dclsamt: 0, indclsamt: 0}, x IN claims |
CASE WHEN x.direct
THEN {dclsamt: s.dclsamt + x.amount, indclsamt: s.indclsamt}
ELSE {dclsamt: s.dclsamt, indclsamt: s.indclsamt + x.amount}
END)
AS data
RETURN co.name as name,cntc, dcls,indcls, data
ORDER BY dcls desc
(これを@cybersamするhattipでは今〜6Sです) (b)のクエリは次のようになります。
MATCH (co:Company)<-[:HAS_PROVIDER]-(c)-[:HAS_CLAIM]->(cl)
WITH distinct co, count (distinct c) as cntc, COLLECT(cl) as cls
WITH co,cntc,
FILTER(n in cls WHERE 'DirectClaim' IN IN LABELS(n)) as dcls,
FILTER(n in cls WHERE 'InDirectClaim' IN LABELS(n)) as indcls
WITH co,cntc, size(dcls) as dclsct, size(indcls) as indclsct,
REDUCE(s = 0 , x IN dcls | s + x.amount) as dclsamt,
REDUCE(s = 0 , x IN indcls | s + x.amount) as indclsamt
RETURN co.name as name, cntc, dclsct, dclsamt, indclsct, indclsamt
aとbの両方のアプローチで現在使用しているクエリを提供できますか? – InverseFalcon
@InverseFalconがクエリを追加しました – gmjordan