これはサイファーです:
START n=node:ACCOUNTS(ACCOUNT_ID={id})
MATCH (n)-[:PROVIDER]->(p)<-[r:ALERT]-()
RETURN r
ORDER BY {o} ASC
SKIP {s} LIMIT {l}
実行計画は次のとおりです。
ColumnFilter(symKeys=[" UNNAMEDS239765216", "n", "m", " UNNAMED3", "p", "r"], returnItemNames=["r"], _rows=50, _db_hits=0)
Slice(skip="{s}", _rows=50, _db_hits=0)
Top(orderBy=["SortItem(Cached( UNNAMEDS239765216 of type Any),true)"], limit="Add", _rows=50, _db_hits=0)
Extract(symKeys=["n", "m", " UNNAMED3", "p", "r"], exprKeys=[" UNNAMEDS239765216"], _rows=42563, _db_hits=0)
TraversalMatcher(trail="(n)-[ UNNAMED3:PROVIDER WHERE true AND true]->(p)<-[r:ALERT WHERE true AND true]-(m)", _rows=42563, _db_hits=614381)
ParameterPipe(_rows=1, _db_hits=0)
アカウントにはプロバイダー (1 対多) があり、プロバイダーには着信アラート関係があります。私はそれらの関係を選択することにのみ興味があります。
最初の実行には次の時間がかかります。
2013-07-18 17:40:54,199 [main] INFO net.ahm.graph.dao.AlertDAO - >>>> GET ALERTS FOR ACCOUNT CYPHER TOOK: 4789 m-secs
同じクエリの 10 回目の実行には次の時間がかかります (エンジンはキャッシュされ、クエリはパラメーター化されます)。
2013-07-18 17:41:15,431 [main] INFO net.ahm.graph.dao.AlertDAO - >>>> GET ALERTS FOR ACCOUNT CYPHER TOOK: 1586 m-secs
ORDER BY を削除すると、次の実行計画と時間になります。
2013-07-20 23:45:09,317 [main] DEBUG net.ahm.graph.dao.AlertDAO - ColumnFilter(symKeys=["n", "m", " UNNAMED3", "p", "r"], returnItemNames=["r"], _rows=50, _db_hits=0)
Slice(skip="{s}", limit="{l}", _rows=50, _db_hits=0)
TraversalMatcher(trail="(n)-[ UNNAMED3:PROVIDER WHERE true AND true]->(p)<-[r:ALERT WHERE true AND true]-(m)", _rows=50, _db_hits=241)
ParameterPipe(_rows=1, _db_hits=0)
2013-07-20 23:45:09,317 [main] INFO net.ahm.graph.dao.AlertDAO - >>>> GET ALERTS FOR ACCOUNT CYPHER TOOK: 9 m-secs