fbpx

CL LAB

HOME > Blog > lee > 婚活支援プロジェクト(4/4): 改善したデータモデルによるデータ処理 #neo4j

婚活支援プロジェクト(4/4): 改善したデータモデルによるデータ処理 #neo4j

 ★ 15

グラフデータベースNeo4jの実践的な利用方法の1例を紹介するために始めたトライアルプロジェクトがいよいよ最終回を迎えました。今回は、トライアルプロジェクトを進めているなかで発生した問題点などの改善策を盛り込んだデータモデルを利用して理想の相手を探してみたいと思います。

第1回目:構想からデータモデル設計まで
第2回目:データ処理と問題点
第3回目:どのように改善したらいいのか
第4回目:改善したデータモデルによるデータ処理(今回)

追加のサブドメイン作成及びデータロード

データモデル

最終的に完成したデータモデルは以下のようなものです。波線のようにリクエスト用のサブドメイン(RE_CATEGORY)と必須要素のフィルター条件用のサブドメイン(FI_CATEGORY)を追加し、居住地域のフィルター条件は人(:Person)の属性(filter_location)として持たせています。

re-datamodel1
MY:Original RE:Request FI:Filter

これから、改善したデータモデルに基づいてノードを追加していFきます。この作業を行いたくない方は、完成したグラフデータベースをダウンロードして利用してください。

ダウンロード konkatu-4.gdb.zip

完成したグラフデータベースを利用する方は、『M04さんのデータ処理をやってみる』に進んでください。

リクエスト用サブドメインの追加

次のCypherクエリーをすべてWebインターフェースに入力して実行してください。

WITH ["野球","サッカー","バレーボール","バスケットボール","テーブルテニス","ヨガ","散歩","ダンス","その他"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (a1:Sport2 {title: list[i]}))

WITH ["土日祝日","平日","不定期"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (b1:Holiday2 {title: list[i]}))

WITH ["聞くタイプ","話すタイプ","とちらでも良い"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (c1:Talk2 {title: list[i]}))

WITH ["積極的","消極的","とちらでもない"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (d1:Meeting2 {title: list[i]}))

WITH [140,150,160,170,180,190,200] as list
FOREACH(i IN range(0, length(list)-1) |
CREATE (e1:Height2 {title: list[i]}))

WITH ["外向的","内向的"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (f1:Personality2 {title: list[i]}))

WITH ["読書","映画感想","音楽感想","TV感想","ゲーム","寝る","友たちとお喋り","料理を作る","その他"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (g1:Indoor2 {title: list[i]}))

WITH ["吸う","吸わない"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (h1:Smoking2 {title: list[i]}))

WITH ["飲む","飲まない"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (j1:Alcohol2 {title: list[i]}))

WITH ["好き","嫌い"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (k1:Karaoke2 {title: list[i]}))

WITH ["信じる","信じない"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (m1:Fortunetelling2 {title: list[i]}))

WITH ["意識して運動する","特に意識していない"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (n1:Healthcare2 {title: list[i]}))

WITH ["海","山","川","公園","遊園地","どちらでもいい"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (o1:Outdoor2 {title: list[i]}))

WITH [100,200,300,400,500,600,700,800,900] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (p1:Income2 {title: list[i]}))

WITH ["北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県","茨城県","栃木県","群馬県","","埼玉県","千葉県","東京都","神奈川県","新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県","静岡県","愛知県","三重県","滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県","徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (q1:Location2 {title: list[i]}))

WITH ["有り","無し"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (r1:Maritalhistory2 {title: list[i]}))

WITH ["犬派","猫派"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (s1:Pet2 {title: list[i]}))

WITH ["義務教育","高等学校","各種専門学校","短大・高専","大学","大学院"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (t1:Education2 {title: list[i]}))

WITH ["公務員","会社員","自営業","企業経営・役員","教師","医師","医療関係","保育士","農林・漁業","パート・アルバイト","学生","家事手伝","その他"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (u1:Job2 {title: list[i]}))

WITH [1995,1994,1993,1992,1991,1990,1989,1988,1987,1986,1985,1984,1983,1982,1981,1980,1979,1978,1977,1976,1975,1974,1973,1972,1971,1970] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (v1:Born2 {title: list[i]}))

結果を確認してみましょう。次のCypherクエリーをWebインターフェースに入力して実行し、ラベル、要素の集合、要素数を確認してください。

MATCH (a:Sport2) RETURN labels(a) AS ラベル,collect(a.title) AS 要素,length(collect(a.title)) AS 数 UNION ALL
MATCH (b:holiday2) RETURN labels(b) AS ラベル, collect(b.title) AS 要素,length(collect(b.title)) AS 数 UNION ALL
MATCH (c:Talk2) RETURN labels(c) AS ラベル, collect(c.title) AS 要素,length(collect(c.title)) AS 数 UNION ALL
MATCH (d:Height2) RETURN labels(d) AS ラベル, collect(d.title) AS 要素,length(collect(d.title)) AS 数 UNION ALL
MATCH (e:Personality2) RETURN labels(e) AS ラベル, collect(e.title) AS 要素,length(collect(e.title)) AS 数 UNION ALL
MATCH (f:Indoor2) RETURN labels(f) AS ラベル, collect(f.title) AS 要素,length(collect(f.title)) AS 数 UNION ALL
MATCH (g:Smoking2) RETURN labels(g) AS ラベル, collect(g.title) AS 要素,length(collect(g.title)) AS 数 UNION ALL
MATCH (h:Alcohol2) RETURN labels(h) AS ラベル, collect(h.title) AS 要素,length(collect(h.title)) AS 数 UNION ALL
MATCH (i:Karaoke2) RETURN labels(i) AS ラベル, collect(i.title) AS 要素,length(collect(i.title)) AS 数 UNION ALL
MATCH (j:Fortunetelling2) RETURN labels(j) AS ラベル, collect(j.title) AS 要素,length(collect(j.title)) AS 数 UNION ALL
MATCH (k:Outdoor2) RETURN labels(k) AS ラベル, collect(k.title) AS 要素,length(collect(k.title)) AS 数 UNION ALL
MATCH (l:Income2) RETURN labels(l) AS ラベル, collect(l.title) AS 要素,length(collect(l.title)) AS 数 UNION ALL
MATCH (m:Born2) RETURN labels(m) AS ラベル, collect(m.title) AS 要素,length(collect(m.title)) AS 数 UNION ALL
MATCH (n:Location2) RETURN labels(n) AS ラベル, collect(n.title) AS 要素,length(collect(n.title)) AS 数 UNION ALL
MATCH (o:Pet2) RETURN labels(o) AS ラベル, collect(o.title) AS 要素,length(collect(o.title)) AS 数 UNION ALL
MATCH (p:Education2) RETURN labels(p) AS ラベル, collect(p.title) AS 要素,length(collect(p.title)) AS 数 UNION ALL
MATCH (q:Job2) RETURN labels(q) AS ラベル, collect(q.title) AS 要素,length(collect(q.title)) AS 数 UNION ALL
MATCH (r:Meet2) RETURN labels(r) AS ラベル, collect(r.title) AS 要素,length(collect(r.title)) AS 数 UNION ALL
MATCH (s:Marriage2) RETURN labels(s) AS ラベル, collect(s.title) AS 要素,length(collect(s.title)) AS 数 UNION ALL
MATCH (t:Healthcare2) RETURN labels(t) AS ラベル, collect(t.title) AS 要素,length(collect(t.title)) AS 数
ラベル 要素 数
[Sport2] [野球, サッカー, バレーボール, バスケットボール, テーブルテニス, ヨガ, 散歩, ダンス, その他] 9
[Talk2] [聞くタイプ, 話すタイプ, とちらでも良い] 3
[Height2] [140, 150, 160, 170, 180, 190, 200] 7
[Personality2] [外向的, 内向的] 2
[Indoor2] [読書, 映画感想, 音楽感想, TV感想, ゲーム, 寝る, 友たちとお喋り, 料理を作る, その他] 9
[Smoking2] [吸う, 吸わない] 2
[Alcohol2] [飲む, 飲まない] 2
[Karaoke2] [好き, 嫌い] 2
[Fortunetelling2] [信じる, 信じない] 2
[Outdoor2] [海, 山, 川, 公園, 遊園地, どちらでもいい] 6
[Income2] [100, 200, 300, 400, 500, 600, 700, 800, 900] 9
[Born2] [1995, 1994, 1993, 1992, 1991, 1990, 1989, 1988, 1987, 1986, 1985, 1984, 1983, 1982, 1981, 1980, 1979, 1978, 1977, 1976, 1975, 1974, 1973, 1972, 1971, 1970] 26
[Location2] [北海道, 青森県, 岩手県, 宮城県, 秋田県, 山形県, 福島県, 茨城県, 栃木県, 群馬県, (empty), 埼玉県, 千葉県, 東京都, 神奈川県, 新潟県, 富山県, 石川県, 福井県, 山梨県, 長野県, 岐阜県, 静岡県, 愛知県, 三重県, 滋賀県, 京都府, 大阪府, 兵庫県, 奈良県, 和歌山県, 鳥取県, 島根県, 岡山県, 広島県, 山口県, 徳島県, 香川県, 愛媛県, 高知県, 福岡県, 佐賀県, 長崎県, 熊本県, 大分県, 宮崎県, 鹿児島県, 沖縄県] 48
[Pet2] [犬派, 猫派] 2
[Education2] [義務教育, 高等学校, 各種専門学校, 短大・高専, 大学, 大学院] 6
[Job2] [公務員, 会社員, 自営業, 企業経営・役員, 教師, 医師, 医療関係, 保育士, 農林・漁業, パート・アルバイト, 学生, 家事手伝, その他] 13
[Healthcare2] [意識して運動する, 特に意識していない] 2

必須要素フィルター条件用のサブドメインの追加

次のCypherクエリーをすべてWebインターフェースに入力して実行してください。

WITH ["野球","サッカー","バレーボール","バスケットボール","テーブルテニス","ヨガ","散歩","ダンス","その他"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (a1:Sport3 {title: list[i]}))

WITH ["土日祝日","平日","不定期"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (b1:Holiday3 {title: list[i]}))

WITH ["聞くタイプ","話すタイプ","とちらでも良い"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (c1:Talk3 {title: list[i]}))

WITH ["積極的","消極的","とちらでもない"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (d1:Meeting3 {title: list[i]}))

WITH [140,150,160,170,180,190,200] as list
FOREACH(i IN range(0, length(list)-1) |
CREATE (e1:Height3 {title: list[i]}))

WITH ["外向的","内向的"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (f1:Personality3 {title: list[i]}))

WITH ["読書","映画感想","音楽感想","TV感想","ゲーム","寝る","友たちとお喋り","料理を作る","その他"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (g1:Indoor3 {title: list[i]}))

WITH ["吸う","吸わない"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (h1:Smoking3 {title: list[i]}))

WITH ["飲む","飲まない"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (j1:Alcohol3 {title: list[i]}))

WITH ["好き","嫌い"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (k1:Karaoke3 {title: list[i]}))

WITH ["信じる","信じない"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (m1:Fortunetelling3 {title: list[i]}))

WITH ["意識して運動する","特に意識していない"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (n1:Healthcare3 {title: list[i]}))

WITH ["海","山","川","公園","遊園地","どちらでもいい"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (o1:Outdoor3 {title: list[i]}))

WITH [100,200,300,400,500,600,700,800,900] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (p1:Income3 {title: list[i]}))

WITH ["有り","無し"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (r1:Maritalhistory3 {title: list[i]}))

WITH ["犬派","猫派"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (s1:Pet3 {title: list[i]}))

WITH ["義務教育","高等学校","各種専門学校","短大・高専","大学","大学院"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (t1:Education3 {title: list[i]}))

WITH ["公務員","会社員","自営業","企業経営・役員","教師","医師","医療関係","保育士","農林・漁業","パート・アルバイト","学生","家事手伝","その他"] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (u1:Job3 {title: list[i]}))

WITH [1995,1994,1993,1992,1991,1990,1989,1988,1987,1986,1985,1984,1983,1982,1981,1980,1979,1978,1977,1976,1975,1974,1973,1972,1971,1970] AS list
FOREACH(i IN range(0, length(list)-1) |
CREATE (v1:Born3 {title: list[i]}))

結果を確認してみましょう。次のCypherクエリーをWebインターフェースに入力して実行し、ラベル、要素の集合、要素数を確認してください。

MATCH (a:Sport3) RETURN labels(a) AS ラベル,collect(a.title) AS 要素,length(collect(a.title)) AS 数 UNION ALL
MATCH (b:holiday3) RETURN labels(b) AS ラベル, collect(b.title) AS 要素,length(collect(b.title)) AS 数 UNION ALL
MATCH (c:Talk3) RETURN labels(c) AS ラベル, collect(c.title) AS 要素,length(collect(c.title)) AS 数 UNION ALL
MATCH (d:Height3) RETURN labels(d) AS ラベル, collect(d.title) AS 要素,length(collect(d.title)) AS 数 UNION ALL
MATCH (e:Personality3) RETURN labels(e) AS ラベル, collect(e.title) AS 要素,length(collect(e.title)) AS 数 UNION ALL
MATCH (f:Indoor3) RETURN labels(f) AS ラベル, collect(f.title) AS 要素,length(collect(f.title)) AS 数 UNION ALL
MATCH (g:Smoking3) RETURN labels(g) AS ラベル, collect(g.title) AS 要素,length(collect(g.title)) AS 数 UNION ALL
MATCH (h:Alcohol3) RETURN labels(h) AS ラベル, collect(h.title) AS 要素,length(collect(h.title)) AS 数 UNION ALL
MATCH (i:Karaoke3) RETURN labels(i) AS ラベル, collect(i.title) AS 要素,length(collect(i.title)) AS 数 UNION ALL
MATCH (j:Fortunetelling3) RETURN labels(j) AS ラベル, collect(j.title) AS 要素,length(collect(j.title)) AS 数 UNION ALL
MATCH (k:Outdoor3) RETURN labels(k) AS ラベル, collect(k.title) AS 要素,length(collect(k.title)) AS 数 UNION ALL
MATCH (l:Income3) RETURN labels(l) AS ラベル, collect(l.title) AS 要素,length(collect(l.title)) AS 数 UNION ALL
MATCH (m:Born3) RETURN labels(m) AS ラベル, collect(m.title) AS 要素,length(collect(m.title)) AS 数 UNION ALL
MATCH (o:Pet3) RETURN labels(o) AS ラベル, collect(o.title) AS 要素,length(collect(o.title)) AS 数 UNION ALL
MATCH (p:Education3) RETURN labels(p) AS ラベル, collect(p.title) AS 要素,length(collect(p.title)) AS 数 UNION ALL
MATCH (q:Job3) RETURN labels(q) AS ラベル, collect(q.title) AS 要素,length(collect(q.title)) AS 数 UNION ALL
MATCH (r:Meet3) RETURN labels(r) AS ラベル, collect(r.title) AS 要素,length(collect(r.title)) AS 数 UNION ALL
MATCH (s:Marriage3) RETURN labels(s) AS ラベル, collect(s.title) AS 要素,length(collect(s.title)) AS 数 UNION ALL
MATCH (t:Healthcare3) RETURN labels(t) AS ラベル, collect(t.title) AS 要素,length(collect(t.title)) AS 数
ラベル 要素 数
[Sport3] [野球, サッカー, バレーボール, バスケットボール, テーブルテニス, ヨガ, 散歩, ダンス, その他] 9
[Talk3] [聞くタイプ, 話すタイプ, とちらでも良い] 3
[Height3] [140, 150, 160, 170, 180, 190, 200] 7
[Personality3] [外向的, 内向的] 2
[Indoor3] [読書, 映画感想, 音楽感想, TV感想, ゲーム, 寝る, 友たちとお喋り, 料理を作る, その他] 9
[Smoking3] [吸う, 吸わない] 2
[Alcohol3] [飲む, 飲まない] 2
[Karaoke3] [好き, 嫌い] 2
[Fortunetelling3] [信じる, 信じない] 2
[Outdoor3] [海, 山, 川, 公園, 遊園地, どちらでもいい] 6
[Income3] [100, 200, 300, 400, 500, 600, 700, 800, 900] 9
[Born3] [1995, 1994, 1993, 1992, 1991, 1990, 1989, 1988, 1987, 1986, 1985, 1984, 1983, 1982, 1981, 1980, 1979, 1978, 1977, 1976, 1975, 1974, 1973, 1972, 1971, 1970] 26
[Pet3] [犬派, 猫派] 2
[Education3] [義務教育, 高等学校, 各種専門学校, 短大・高専, 大学, 大学院] 6
[Job3] [公務員, 会社員, 自営業, 企業経営・役員, 教師, 医師, 医療関係, 保育士, 農林・漁業, パート・アルバイト, 学生, 家事手伝, その他] 13
[Healthcare3] [意識して運動する, 特に意識していない] 2

リクエスト用の関係性の作成

次のCypherクエリーをすべてWebインターフェースに入力して実行してください。

MATCH
(man:Man { name: "M04"}),
(a1:Alcohol2 { title: "飲む" }),
(a2:Born2 { title: 1981 }),
(b2:Born2 { title: 1982 }),
(c2:Born2 { title: 1983 }),
(d2:Born2 { title: 1984 }),
(e2:Born2 { title: 1985 }),
(f2:Born2 { title: 1986 }),
(g2:Born2 { title: 1987 }),
(h2:Born2 { title: 1988 }),
(i2:Born2 { title: 1989 }),
(a3:Education2 { title: "短大・高専" }),
(b3:Education2 { title: "大学" }),
(c3:Education2 { title: "大学院" }),
(a4:Fortunetelling2 { title: "信じない" }),
(a5:Healthcare2 { title: "意識して運動する" }),
(a6:Height2 { title : 140 }),
(b6:Height2 { title : 150 }),
(c6:Height2 { title : 160 }),
(a7:Holiday2 { title : "土日祝日" }),
(a8:Income2 { title : 100 }),
(b8:Income2 { title : 200 }),
(c8:Income2 { title : 300 }),
(d8:Income2 { title : 400 }),
(e8:Income2 { title : 500 }),
(f8:Income2 { title : 600 }),
(g8:Income2 { title : 700 }),
(h8:Income2 { title : 800 }),
(i8:Income2 { title : 900 }),
(a9:Indoor2 { title : "映画感想" }),
(b9:Indoor2 { title : "ゲーム" }),
(a10:Job2 { title : "公務員" }),
(b10:Job2 { title : "会社員" }),
(c10:Job2 { title : "自営業" }),
(d10:Job2 { title : "企業経営・役員" }),
(e10:Job2 { title : "教師" }),
(f10:Job2 { title : "医師" }),
(g10:Job2 { title : "医療関係" }),
(h10:Job2 { title : "保育士" }),
(i10:Job2 { title : "農林・漁業" }),
(j10:Job2 { title : "パート・アルバイト" }),
(k10:Job2 { title : "その他" }),
(a11:Karaoke2 { title : "好き" }),
(a12:Location2 { title : "埼玉県" }),
(b12:Location2 { title : "千葉県" }),
(c12:Location2 { title : "東京都" }),
(d12:Location2 { title : "神奈川県" }),
(a13:Maritalhistory2 { title : "無し" }),
(a14:Meeting2 { title : "積極的" }),
(a15:Outdoor2 { title : "海" }),
(b15:Outdoor2 { title : "川" }),
(a16:Personality2 { title : "外向的" }),
(b16:Personality2 { title : "内向的" }),
(a17:Pet2 { title : "猫派" }),
(a18:Smoking2 { title : "吸わない" }),
(a19:Sport2 { title : "野球" }),
(b19:Sport2 { title : "サッカー" }),
(c19:Sport2 { title : "バレーボール" }),
(d19:Sport2 { title : "バスケットボール" }),
(e19:Sport2 { title : "テーブルテニス" }),
(f19:Sport2 { title : "ヨガ" }),
(g19:Sport2 { title : "散歩" }),
(h19:Sport2 { title : "ダンス" }),
(i19:Sport2 { title : "その他" }),
(a20:Talk2 { title : "話すタイプ" })
//RETURN *
CREATE
man-

Author

データベースが大好きなサーバサイドのエンジニア。現代的なデータ基盤のソリューションアーキテクトとして活動しています。

[著書]
グラフデータベースNeo4jの他
https://www.amazon.co.jp/李昌桓/e/B004LWEKOU

leeの記事一覧

CL LAB Mail Magazine

CL LABの情報を逃さずチェックしよう!

メールアドレスを登録すると記事が投稿されるとメールで通知します。

メールアドレス: 登録

※登録後メールに記載しているリンクをクリックして認証してください。

Related post

[無料ウェビナー] GitLab_CI/CDハンズオン_2023111