sqliteと neo4jでやること
最適な店舗の提案
価格比較+購入パターン分析
* 過去の購入データを分析し、最安値の店舗を提案
* 店舗ごとのセールパターンを学習
* 例:「〇〇スーパーは毎週火曜に卵が安い」「ドラッグストアでシャンプーがポイント還元率が高い」
最適な店舗の提案
① データ分析
* 過去の購入履歴を集計
* 商品ごとの平均価格
* 最安値の店舗ランキング
* 曜日ごとの傾向分析
* 「火曜にスーパーAが安い」
* 「週末にまとめ買いするとお得」
② 店舗の最適化提案
* 次回の最適な購入場所をLINE通知
* 「牛乳はスーパーB(178円)、卵はスーパーC(99円)がお得」
* 「来週火曜にドラッグストアDで洗剤のセールあり」
* Webスクレイピングで最新セール情報取得
* 各スーパー・ドラッグストアのWebチラシをチェック
* 「チラシプラス」「Shufoo!」API活用
など
SQLite では商品ごとの最安値の店舗を検索するのも簡単
GraphDB での管理
GraphDB はノード(商品・店舗)とエッジ(購入履歴)で関係を管理できるため、例えば「特定の商品をどの店舗で買うべきか」の分析が容易になります。
① GraphDB の選択肢
* Neo4j(Python なら neo4j ライブラリを利用)
データの構造(ノードとリレーション)
* ノード
* (:Item {name: “牛乳”})
* (:Store {name: “スーパーA”})
* リレーション
* (:Item)-[:SOLD_AT {price: 198, date: “2025-02-01”}]->(:Store)
購入履歴の管理と最適な店舗の提案を行う
例
import sqlite3
conn = sqlite3.connect("shopping.db")
cur = conn.cursor()
cur.execute("INSERT INTO purchases (date, store, item, price) VALUES (?, ?, ?, ?)",
("2025-02-01", "スーパーA", "牛乳", 198))
conn.commit()
conn.close()
で
データの追加
購入データの検索
cur.execute("SELECT * FROM purchases WHERE item = ?", ("牛乳",))
print(cur.fetchall())
また
SQLite で商品ごとの最安値の店舗を検索
cur.execute("""
SELECT item, store, MIN(price) as min_price
FROM purchases
GROUP BY item
""")
print(cur.fetchall())
Neo4j でのデータ登録なら
from neo4j import GraphDatabase
uri = "bolt://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("neo4j", "password"))
def add_purchase(tx, item, store, price, date):
query = """
MERGE (i:Item {name: $item})
MERGE (s:Store {name: $store})
CREATE (i)-[:SOLD_AT {price: $price, date: $date}]->(s)
"""
tx.run(query, item=item, store=store, price=price, date=date)
with driver.session() as session:
session.write_transaction(add_purchase, "牛乳", "スーパーA", 198, "2025-02-01")
購入履歴から最適な店舗を検索なら
MATCH (i:Item {name: "牛乳"})-[r:SOLD_AT]->(s:Store)
RETURN s.name AS store, MIN(r.price) AS lowest_price
SQLite と GraphDB の使い分け
| 機能 | SQLite | GraphDB | | ----------- | --------------- | -------------------- | | データの保存 | 高速・軽量 | 遅め(構造化に向いている) | | 最安値検索 | シンプルな SQL で実装可能 | 関係性を活かした分析が得意 | | データの可視化 | 表形式が得意 | ネットワーク分析が可能 | | セールや価格変動の分析 | やや複雑 | 履歴をノード間リレーションで管理しやすい |
結論
* SQLite: 基本的な購入データ管理(最安値検索・履歴保存)に向いている。
* GraphDB: 「どの店舗でどの商品を買うべきか?」を関係性で分析するのに適している。
まずは SQLite をメインに使用し、分析が必要な部分を GraphDB に移行するのが良さそう
sqlite と neo4jを組み合わせることはできるか?
SQLite と Neo4j を組み合わせることは可能
れぞれの役割を明確にし、データの流れを整理すれば、最適な購買管理システムを構築できる
SQLite と Neo4j の役割分担
| データ | SQLite | Neo4j | | ----------------- | ------ | -------------- | | 購入履歴(商品・価格・店舗・日付) | ✅ | ✅ | | 最安値の検索 | ✅(SQL) | ✅(Graph Query) | | 価格の履歴管理 | ✅ | ✅(関係性を活用) | | 商品と店舗の関係分析 | ❌ | ✅(ネットワーク解析) | | セール・特売情報との連携 | ❌ | ✅(リレーション活用) |
SQLite は「履歴管理」「最安値検索」に適している
Neo4j は「店舗と商品の関係分析」「価格変動の視覚化」に向いている
SQLite のデータを Neo4j に同期させることで、購入履歴と分析機能を両方活用できる
SQLite から Neo4j にデータを移行
Neo4j は APOC(ライブラリ)を使って外部データをインポートできる
まずSQLite のデータを取得
import sqlite3
import pandas as pd
# SQLiteに接続
conn = sqlite3.connect("shopping.db")
df = pd.read_sql("SELECT date, store, item, price FROM purchases", conn)
conn.close()
次にNeo4j にデータを挿入
from neo4j import GraphDatabase
# Neo4jの接続情報
uri = "bolt://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("neo4j", "password"))
# データ挿入関数
def add_purchase(tx, date, store, item, price):
query = """
MERGE (i:Item {name: $item})
MERGE (s:Store {name: $store})
CREATE (i)-[:SOLD_AT {price: $price, date: $date}]->(s)
"""
tx.run(query, item=item, store=store, price=price, date=date)
# SQLite のデータを Neo4j に登録
with driver.session() as session:
for _, row in df.iterrows():
session.write_transaction(add_purchase, row["date"], row["store"], row["item"], row["price"])
ここまでできたら
Neo4j でのデータ分析
Neo4j を使うことで、「この商品はどの店舗が安いか?」 などの分析が容易になる
商品ごとの最安値店舗を検索
MATCH (i:Item)-[r:SOLD_AT]->(s:Store) WITH i, s, r ORDER BY r.price ASC RETURN i.name AS 商品, s.name AS 最安店舗, r.price AS 価格
ある店舗の価格変動を可視化
MATCH (i:Item)-[r:SOLD_AT]->(s:Store) RETURN i.name AS 商品, COUNT(s) AS 店舗数, AVG(r.price) AS 平均価格 ORDER BY 平均価格 ASC
特定の商品の購入パターン分析
MATCH (i:Item)-[r:SOLD_AT]->(s:Store) RETURN i.name AS 商品, COUNT(s) AS 店舗数, AVG(r.price) AS 平均価格 ORDER BY 平均価格 ASC
次に
SQLite と Neo4j の同期方法