0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GraphDBを学ぶ(5)neo4jでTPC-H Query1を実行してみる

Posted at

TL;DR

  • 前回,neo4jサーバにsf=0.01のデータベースを格納しました
  • TPC-Hのsf=0.01のデータベースに対して,Cypherクエリに修正したTPC-H Query1を実行して,ベンチマークします

TPC-H Query 1の概要

  • OLAP向けベンチマークTPC-Hが用意している22種類のクエリのうちのうちの1つで,TPC-Hデータベース中のlineitemテーブルから,データを集約して取り出すものです

    • 大規模データの集約性能の計測に使用されるものです
  • TPC-H Query1のもともとのクエリ(q1.sql)は以下のものです

select l_returnflag, l_linestatus,
       sum(l_quantity) as sum_qty,
       sum(l_extendedprice) as sum_base_price,
       sum(l_extendedprice*(1-l_discount)) as sum_disc_price,
       sum(l_extendedprice*(1-l_discount)*(1+l_tax)) as sum_charge,
       avg(l_quantity) as avg_qty,
       avg(l_extendedprice) as avg_price,
       avg(l_discount) as avg_disc,
       count(*) as count_order
from lineitem
where l_shipdate <= date '1998-12-01' - interval '[DELTA]' day (3)
group by l_returnflag, l_linestatus
order by l_returnflag, l_linestatus;
  • クエリの最適化過程で順番が前後するかもしれませんが,処理の概要は以下のとおりです
    • lineitemテーブルを読み出し,処理を行います(from lineitem)
    • 条件にあったレコードのみを計算対象にします
      • where 句で,l_shipdateがある日時より以前のレコードを対象とします
    • カラムの値ごとに集計します
      • l_returnflagl_linestatusの組み合わせごとに集計します
    • 集計する内容は,いくつかのカラムの値とその集計値です
      • 集計する値は,「価格l_extendedprice」と「量l_quantity」,「割引率l_discountと税金l_tax」を使って求められる値の,「総計sum」および「平均値avg」,「数count」です

Cypherクエリに書き直したTPC-H Query 1

  • 前項のTPC-H Query1を,以下のようにCypherクエリで書き換えました
MATCH(l :lineitem)
    WHERE l.L_SHIPDATE <=
      DATE({ year:1998, month:12, day:1}) - duration('P3D')
    RETURN 
        l.L_RETURNFLAG,
        l.L_LINESTATUS,
        sum(l.L_QUANTITY) AS sum_qty,
        sum(l.L_EXTENDEDPRICE) AS sum_base_price,
        sum(l.L_EXTENDEDPRICE*(1-l.L_DISCOUNT)) AS sum_disc_price,
        sum(l.L_EXTENDEDPRICE*(1-l.L_DISCOUNT)*(1+l.L_TAX)) AS sum_charge, 
        avg(l.L_QUANTITY) as avg_qty, avg(l.L_EXTENDEDPRICE) AS avg_price, 
        avg(l.L_DISCOUNT) as avg_disc, count(*) AS count_order
      ORDER BY l.L_RETURNFLAG, l.L_LINESTATUS;
  • neo4j上で作成したグラフから,lineitemラベルのノードを取り出します
    • MATCH句でlineitemラベルを取り出し,lなる変数名で後続の処理を行います
  • 条件にあったレコードを抜き出します
    • WHERE句で,L_SHIPDATEが該当日時以前のものを計算対象にします
    • SQLとCypherで,日時条件の表現方法が若干異なります
  • 各ノードで行う計算を行います
  • 表示順を調整します
    • ORDER BY句はSQLと同じです

neo4j上でTPC-H Query 1を実行

  • 前項のCypherクエリを実行した結果を示します
┌──────────────────┬──────────────────┬─────────────────┬─────────────────────┬─────────────────────┬─────────────────────┬─────────────┬────────────────┬────────────┬──────────────┐
 l.L_RETURNFLAG    l.L_LINESTATUS    sum_qty          sum_base_price       sum_disc_price       sum_charge           avg_qty      avg_price       avg_disc    count_order  
╞══════════════════╪══════════════════╪═════════════════╪═════════════════════╪═════════════════════╪═════════════════════╪═════════════╪════════════════╪════════════╪══════════════╡
 A                 F                 380456.000000    532348211.649998     505822441.486102     526165934.000839     25.575155    35785.709307    0.050081    14876        
 N                 F                 8971.000000      12384801.370000      11798257.208000      12282485.056933      25.778736    35588.509684    0.047759    348          
 N                 O                 765181.000000    1072769060.239996    1019433269.196703    1060338999.761885    25.466136    35703.033922    0.049928    30047        
 R                 F                 381449.000000    534594445.349998     507996454.406699     528524219.358906     25.597168    35874.006533    0.049828    14902        
└──────────────────┴──────────────────┴─────────────────┴─────────────────────┴─────────────────────┴─────────────────────┴─────────────┴────────────────┴────────────┴──────────────┘
4 rows returned in 811ms (first row after 811ms, rendered after 814ms)
  • MySQLで実行したQuery 1の実行結果も示します
+--------------+--------------+-----------+----------------+-----------------+-------------------+-----------+--------------+----------+-------------+
| l_returnflag | l_linestatus | sum_qty   | sum_base_price | sum_disc_price  | sum_charge        | avg_qty   | avg_price    | avg_disc | count_order |
+--------------+--------------+-----------+----------------+-----------------+-------------------+-----------+--------------+----------+-------------+
| A            | F            | 380456.00 |   532348211.65 |  505822441.4861 |  526165934.000839 | 25.575155 | 35785.709307 | 0.050081 |       14876 |
| N            | F            |   8971.00 |    12384801.37 |   11798257.2080 |   12282485.056933 | 25.778736 | 35588.509684 | 0.047759 |         348 |
| N            | O            | 765181.00 |  1072769060.24 | 1019433269.1967 | 1060338999.761883 | 25.466136 | 35703.033922 | 0.049928 |       30047 |
| R            | F            | 381449.00 |   534594445.35 |  507996454.4067 |  528524219.358903 | 25.597168 | 35874.006533 | 0.049828 |       14902 |
+--------------+--------------+-----------+----------------+-----------------+-------------------+-----------+--------------+----------+-------------+
4 rows in set (0.15 sec)
  • RDBMSとGraphDBで,同じ結果が得られました(丸めで値に若干の差はあります)
  • このような方法で,Query1以外のクエリについても実行を検討します

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?