購入管理のCypherクエリ

購入管理のCypherクエリ

購入頻度(日付順)と数量確認

MATCH (:Store)-[r:PURCHASED_ON]->(i:Item {name: "たい"})
RETURN r.date AS date, r.quantity AS quantity
ORDER BY r.date

Pythonで r.date を日付に変換して、間隔(差分)を出せば
「何日おきに買っているか」がわかる

店舗別の購入回数

MATCH (s:Store)-[r:PURCHASED_ON]->(i:Item {name: "たい"})
RETURN s.name AS store, COUNT(*) AS times
ORDER BY times DESC

店舗依存度が見える(1店舗に集中?複数利用?)

価格と日付の傾向(最安値・平均)

MATCH (:Store)-[r:PURCHASED_ON]->(i:Item {name: "たい"})
RETURN r.date AS date, r.unit_price AS unit_price
ORDER BY r.date

折れ線グラフにして価格のトレンドを可視化

Neo4jから価格履歴をクエリで取得

MATCH (s:Store {name: "COOP ユーコープ 袋井町店"})-[r:PURCHASED_ON]->(i:Item {name: "たい"})
RETURN r.date AS date, r.unit_price AS unit_price
ORDER BY r.date

現在のNeo4jへの登録処理を確認するには
「現在の登録処理(ノード・リレーション構造)」を確認するには、Neo4j Browser または Cypher シェルでグラフ全体や構造を可視化するクエリを実行するのが基本

MATCH (n)-[r]->(m) RETURN n, r, m LIMIT 100

これで
ノード(n, m)とリレーション(r)を100件まで表示
実際のノードの種類(Store、Item)と関係(PURCHASED_ON)が図で確認できる

次に
✅ 目的
「同じ商品を複数店舗で購入した履歴がある場合に、最も安かった店舗と価格を一覧表示」する。

MATCH (s:Store)-[r:PURCHASED_ON]->(i:Item)
WITH i.name AS item, r.unit_price AS price, s.name AS store
ORDER BY item, price ASC
WITH item, collect({store: store, price: price}) AS store_prices
RETURN item, store_prices[0].store AS cheapest_store, store_prices[0].price AS min_price
ORDER BY item

商品ごとの最安値店舗一覧
が表示可能

🧠 解説
* MATCH で Store → PURCHASED_ON → Item の関係を取得
* WITH + ORDER BY で商品ごとに価格の安い順に並べる
* collect(…)[0] で最も安かった店舗と価格を取得

✅ 特定の商品だけ調べたい場合
例えば “たい” という商品に絞りたい場合

MATCH (s:Store)-[r:PURCHASED_ON]->(i:Item {name: "たい"})
RETURN s.name AS store, r.unit_price AS price
ORDER BY price ASC
LIMIT 1

これを pythonコードにすると

 vim cheapest_store.py

from neo4j import GraphDatabase
import pandas as pd

# Neo4jの接続情報を入力
uri = "bolt://localhost:7687"
auth = ("neo4j", "あなたのパスワード")  # ここを実際のパスワードに書き換えてください

driver = GraphDatabase.driver(uri, auth=auth)

def fetch_cheapest_store_per_item(tx):
    query = """
    MATCH (s:Store)-[r:PURCHASED_ON]->(i:Item)
    WITH i.name AS item, r.unit_price AS price, s.name AS store
    ORDER BY item, price ASC
    WITH item, collect({store: store, price: price}) AS store_prices
    RETURN item, store_prices[0].store AS cheapest_store, store_prices[0].price AS min_price
    ORDER BY item
    """
    result = tx.run(query)
    return [record.data() for record in result]

with driver.session() as session:
    records = session.execute_read(fetch_cheapest_store_per_item)

driver.close()

# 表形式で出力
df = pd.DataFrame(records)
print(df.to_string(index=False))

で実行

            item      cheapest_store  min_price
  COジョウエラミックスナッツ     COOP ユーコープ 袋井町店        298
      COゼリーエネルギー     COOP ユーコープ 袋井町店        118
   COゼリーエネルギー60F     COOP ユーコープ 袋井町店        178
          CO冷凍茶豆     COOP ユーコープ 袋井町店        158
   おかめ納豆 まろやか旨味ミ             ピアゴ 袋井店         97
          かつおたたき     COOP ユーコープ 袋井町店        398
       きゅうり/丸数農園             とれたて食楽部        150
      きゅうり/河井 恵美             とれたて食楽部        100
     ごぼう/とれたて食楽部             とれたて食楽部        280
            ししゃも     COOP ユーコープ 袋井町店        298
       じゃが芋/澤口正則             とれたて食楽部        250
      その他切り花/竹原秀             とれたて食楽部        210
              たい     COOP ユーコープ 袋井町店        398
    だしのきいたなめらか玉子             ピアゴ 袋井店        128
        なす/大石真智子             とれたて食楽部        260
            なす/袋     COOP ユーコープ 袋井町店        138
    はごろも シーチキンLフ           遠鉄ストア 浅羽店        338
           ぶなしめじ ドラッグストア クリエイト 袋井山名店         98
            まいたけ     COOP ユーコープ 袋井町店         88
         アーリーレッド             とれたて食楽部        230
        イチゴ/鈴木康友             とれたて食楽部        230
          イチジク習慣           遠鉄ストア 浅羽店        398
       コーヒー/濱小路徳             とれたて食楽部       1090
      コーヒー/満り路仁徳             とれたて食楽部       1090
      サンテビオ 15mL           杏林堂 袋井旭町店        968
         シュガーコーン     COOP ユーコープ 袋井町店        278
     タイレノールA 30錠             ピアゴ 袋井店       1790
      バジルMIXピッツァ     COOP ユーコープ 袋井町店        428
        バラ/大場安輝子             とれたて食楽部        300
  ビオヨーグルト プレーン加糖 ドラッグストア クリエイト 袋井山名店        178
       ピーマン/小林宗作             とれたて食楽部        140
        フィリピンバナナ     COOP ユーコープ 袋井町店        138
    フルーツフェスタアップル ドラッグストア クリエイト 袋井山名店        198
    フルーツフェスタフルーツ ドラッグストア クリエイト 袋井山名店        198
フルーツフェスタフルーツミックス ドラッグストア クリエイト 袋井山名店        198
  ブルボン デザートマルシェ白 ドラッグストア クリエイト 袋井山名店         93
     ベビーリーフ/南グロー             とれたて食楽部        120
    ボスコEVオリーブオイル     COOP ユーコープ 袋井町店        898
      ルッコラ/Gファーム             とれたて食楽部        180
       レタス/山田さち子             とれたて食楽部        140
       レタス/山田さち子             とれたて食楽部        150
   ロイヤルブレッド山型(5) ドラッグストア クリエイト 袋井山名店        139
     ロイヤルブレッド(6) ドラッグストア クリエイト 袋井山名店        139
           塩銀鮭切身     COOP ユーコープ 袋井町店        398
         大根/石原義浩             とれたて食楽部        150
          天ぷら用えび     COOP ユーコープ 袋井町店        398
      家族の潤いマスカット ドラッグストア クリエイト 袋井山名店        108
     家族の潤い白桃ミックス ドラッグストア クリエイト 袋井山名店        108
    日興フーズ 王様のチーズ ドラッグストア クリエイト 袋井山名店        298
    日興フーズ 王様のデーツ ドラッグストア クリエイト 袋井山名店        298
      明和水産 切身・丸魚             ピアゴ 袋井店        478
   明治おいしい牛乳900ml             ピアゴ 袋井店        247
      森永バター 200g ドラッグストア クリエイト 袋井山名店        458
            生豚挽肉     COOP ユーコープ 袋井町店        522
        白ねぎ/鈴木正孝             とれたて食楽部        170
           真あじ開き     COOP ユーコープ 袋井町店        398
           若鶏ムネ肉     COOP ユーコープ 袋井町店        594
       菌床椎茸/永井晃太             とれたて食楽部        260
      豚ヒレかたまりカナダ     COOP ユーコープ 袋井町店        630
             豚小間     COOP ユーコープ 袋井町店        535
            豚小間切             とれたて食楽部        336
           豚小間切れ     COOP ユーコープ 袋井町店        190
           赤魚粕漬け     COOP ユーコープ 袋井町店        398
         雑貨/小路仁徳             とれたて食楽部        390
  雪印メグミルク 牧場の朝ヨー ドラッグストア クリエイト 袋井山名店         99
     静岡そだち牛肉入りコロ             とれたて食楽部        390
           鮭・くず桜     COOP ユーコープ 袋井町店        238
    鶏卵パック MS 10個 ドラッグストア クリエイト 袋井山名店        228
   鶏卵卵パック MS 10個 ドラッグストア クリエイト 袋井山名店        228
          黄金しょうが     COOP ユーコープ 袋井町店        178

となる

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です