購入管理の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
となる