【发布时间】:2016-10-18 10:21:07
【问题描述】:
有什么建议可以通过改进图形结构或查询以下内容来提高性能?理想情况下,我想让它达到 1 秒以下。现在我能得到的最好的结果是大约 8 秒,在大约 2M 节点和 10M rels 上有 7M db 点击。
我有图结构在哪里
(co:Company)<-[:HAS_PROVIDER]-(c:Customer)-[:HAS_CLAIM]->(c:Claim)
- 每个声明都有一个布尔属性“direct”以及一个名为“amount”的属性
- 每家公司都有一个名字
- 客户可以有多个索赔,但只有一个公司
我希望能够参加演出:
- 不同的公司名称
- 公司的客户数量
- direct=true 声明计数
- direct=true 索赔的金额总和
- direct=false 声明计数
- direct=false 索赔的金额总和
为此,我使用了两种方法:
a) 创建了从客户到索赔的关系,其中 direct=true 为 :IS_DIRECT,direct=false 为 :IS_INDIRECT
b) 将每个 direct=true 声明标记为 :DirectClaim 节点,将 direct=false 声明标记为 :InDirectClaim 节点
使用 (a) 允许我通过 rels TYPE 上的过滤器获取公司名称、客户数量、(IS_DIRECT) 的大小和大小 (IS_INDIRECT)。但是,无论配置如何,都可以使用提取、过滤、减少超时的组合来获取总和(数量)。
使用 (b) 有效,但需要大约 10 秒
编辑:
查询 (a) 看起来像(加上 @cybersam 的帽子,现在是 ~6s)
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
查询 (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 添加了查询