11. Neo4j User Group.
データ収集PFのツールマッピング
11
Real Time Process
Message Pool
画像/音声
File Store
Near Real Time
Process
Batch Process
Data Store
テキスト
GW
MQTT?
データマート
データレイク
データソース
Data Mart
Service
Queue
画像処理
22. Neo4j User Group.
デモ(Neo4jの演習データベース使用)
22
・Keanu Reevesさんを検索
MATCH (p:Person)
WHERE p.name="Keanu Reeves"
RETURN p
・Keanu Reevesさんが出演した映画に出演した俳優を検索
MATCH (p1:Person)-[r1:ACTED_IN]->(m:Movie)<-[r2:ACTED_IN]-(p2:Person)
WHERE p1.name="Keanu Reeves"
RETURN p1,p2,m,r1,r2
・脚本を書いて、プロヂュースし、監督までしている人と映画を検索する。
MATCH (a:Person)-[r:WROTE|PRODUCE|DIRECTED]->(b), (a)-[:WROTE]->(b), (a)-[:PRODUCED]->(b)
RETURN *
37. Neo4j User Group.
THE PANAMA PAPERS
37
1150万点に及ぶ「パナマ文書」は、ドイツの日
刊紙「南ドイツ新聞」が匿名の情報源から入手
し、米非営利組織「国際調査報道ジャーナリス
ト連合」(The International Consortium of
Investigative Journalists=ICIJ、本部ワシント
ン)が世界の100を超える報道機関に公開。同国
のタックスヘイブン(租税回避地)を利用して
各国指導者や富裕層らが脱税や資金洗浄を行っ
ている証拠を示すものになった。
Neo4jがバックエンドのデータストア
であり、Neo4jのCypherが分析ツール
として使われている。
40. Neo4j User Group.
Retail Banking - First Party Fraud Impact
• Tens of billions of dollars every year lost by U.S. Banks.(1)
• 25% of total consumer credit charge-offs in the United States.(2)
• 10%-20% of unsecured bad debt at leading U.S. and European
banks is misclassified, and is actually first party fraud.(3)
(1): Experian: http://www.experian.com/assets/decision-analytics/white-papers/first-partyfraud-wp.pdf
(2): Experian: http://www.experian.com/assets/decision-analytics/white-papers/first-partyfraud-wp.pdf
(3): Business Insider: http://www.businessinsider.com/how-to-use-social-networks-in-the-fight-against-
first-party-fraud-2011-3
40
消費者金融において被害額は想像を絶する
41. Neo4j User Group.
Retail Banking – First-Party Fraud
• What is it?
– When “people” open many lines of credit with no intention of paying them back
41
この詐欺集団は、善良な市民を
装い、作ったカードで支払いを
行うなど普通に生活しながら、
信用を得た後、ある日突然、限
度額までを引き出し、姿を消す
という。
42. Neo4j User Group.
Retail Banking - Synthetic Identities and Fraud Rings
Fraud ring with 4 synthetic identities, 4-5 accounts for each identity, totaling 18 accounts.
Assuming an average of $4K in credit exposure per account, the bank‟s loss could be as high as
$72K.
42
この例示では、4つの偽造IDで、それぞれ4~5個のアカウントを作り、18個の口座やカードを持つ
詐欺リングを表している。
43. Neo4j User Group.
Retail Banking - Traditional Approaches
Gartner’s Layered Fraud Prevention Approach (4)
(4): Gartner at http://www.gartner.com/newsroom/id/1695014
伝統的な手法で、この類の犯罪を摘発することは困難であるという。
44. Neo4j User Group.
Retail Banking - Modeling a Fraud Ring as a Graph
44
グラフモデルでは、わずかな手掛かりの関係性を繋げて詐欺リングの可能性を探索できる。
45. Neo4j User Group.
Insurance Fraud – “Whiplash for Cash”
• The impact of fraud on the insurance industry is estimated to be $80
billion annually in the US… and growing.(5)
• In the UK, insurers estimate that bogus whiplash claims add $144 per
year to each driver’s policy. (6)
• Auto insurance fraud adds $200-$300 a year to your individual
insurance premium, according to estimates from the National
Insurance Crime Bureau (NICB)(7).
(5): Coalition against insurance fraud: http://www.insurancefraud.org/article.htm?RecID=3274#.UnWuZ5E7ROA
(6): Insurance Fraud Organization: http://www.insurancefraud.org/IFNS-detail.htm?key=17499#.UmmsJyQhZ0o
(7): Edmunds: http://www.edmunds.com/auto-insurance/auto-insurance-fraud-what-it-costs-you.html
45
偽の交通事故による被害補償もその被害額は想像を絶するという。
46. Neo4j User Group.
Insurance Fraud - “Whiplash for Cash” Example
Six-person collusion results in three false accidents:
Each person plays the role of “driver” once and “passenger” twice. Assuming an average claim of $20K per injured person,
and $5K per car, the ring can claim $390K in total.
46
加害者と被害者、お医者さん、弁護士など役割分担をしている正当な身分を持つグループが、お小遣い
稼ぎ(?)をする
47. Neo4j User Group.
Insurance Fraud - Exponential Impacts
Ten people collude to commit insurance fraud, five false accidents are staged
Assuming an average claim of $40K per injured person and $5K per car, the ring can claim up to $1.6M for 40 people
injured! where each person plays the role of the driver once, a witness once and a passenger three times.
47
時をおいて、被害者が加害者になったりしながら詐欺行為を繰り返す。
48. Neo4j User Group.
Insurance Fraud - Traditional Approaches
Gartner’s Layered Fraud Prevention Approach (4)
(4): Gartner at http://www.gartner.com/newsroom/id/1695014
伝統的な手法で、この類の犯罪を摘発することは困難であるという。
49. Neo4j User Group.
Insurance Fraud - Modeling Insurance Fraud as a Graph
View of Fraud Ring Inside of a Graph Database
49
グラフモデルでは、わずかな手掛かりの関係性を繋げて詐欺リングの可能性を探索できる。
50. Neo4j User Group.
Knowledge Graph
50
https://neo4j.com/blog/nasa-critical-data-knowledge-graph/?ref=solutions#what-is-knowledge-architecture
NASAほどの膨大な文献をもっている組織がいるでしょうか。
64. Neo4j User Group.
キーとバリューで指定できる。
{Key:Value, Key:Value, Key:Value, …}
• Number, an abstract type, which has the subtypes Integer and Float
• String
• Boolean
• The spatial type Point
• Temporal types: Date, Time, LocalTime, DateTime, LocalDateTime and Duration
属性の表現
64
65. Neo4j User Group.
ノードを登録する
→Web UI、CLI、APIで実行できる
65
CREATE
(movie:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real
World'})
CREATE
(keanu:Person {name:'Keanu Reeves', born:1964})
映画の登録
俳優さんの登録
CREATE (識別子:ラベル {キー:バリュー,キー:バリュー, ・・・})
66. Neo4j User Group.
• CREATE (keanu)-[:ACTED_IN {roles:['Neo']}]->(movie)
関係性を登録する
66
67. Neo4j User Group.
• CREATE
CREATE
• READ
MATCH
[WHERE]
RETURN
• UPDATE/DELETE
MATCH
[WHERE]
SET/REMOVE
UPDATE/DELETE
CRUD・・・SQLライクなシンプルな構文で実行する
67
CRATE (ノード)<-[関係性 ]-(ノード)
MATCH (ノード)<-[関係性 ]-(ノード)
WHERE ノード.名称 = „value‟
RETURN ノード
MATCH (ノード)<-[関係性 ]-(ノード)
WHERE ノード.名称 = „value‟
UPDATE SET[REMOVE] ノード.名称= „value‟
[ DELETE ノード)
68. Neo4j User Group.
大量データをロードする場合(LOAD CSV)
68
LOAD CSV FROM 'file:///C:/temp/csv/artists.csv' AS line
CREATE (:Artist { name: line[1], year: toInt(line[2])})
• データを読み込んでCyhper Queryに食べさせる
• 既存のデータベースへ追加できる
• 比較的に尐量のデータの追加・変更などに便利
• パフォーマンスが良くない
72. Neo4j User Group.
Cyhperが難しいですか?
思い切り、RDB的なことをやってみたらどうでしょうか
72
MATCH (y:Year {year:2014})-->(m:Month {month:9})-->(d)-->(h)-->(o)<-[:PLACED]-(u)
WITH u, sum(o.number * o.price) AS total
WITH
CASE WHEN u.born > 1994 AND u.gender="man" THEN sum(total) END AS lt20m,
CASE WHEN u.born > 1994 AND u.gender="woman" THEN sum(total) END AS lt20w,
CASE WHEN u.born > 1984 AND u.born <= 1994 AND u.gender="man" THEN sum(total) END AS lt30m,
CASE WHEN u.born > 1984 AND u.born <= 1994 AND u.gender="woman" THEN sum(total) END AS lt30w,
CASE WHEN u.born > 1974 AND u.born <= 1984 AND u.gender="man" THEN sum(total) END AS lt40m,
CASE WHEN u.born > 1974 AND u.born <= 1984 AND u.gender="woman" THEN sum(total) END AS lt40w,
CASE WHEN u.born > 1964 AND u.born <= 1974 AND u.gender="man" THEN sum(total) END AS lt50m,
CASE WHEN u.born > 1964 AND u.born <= 1974 AND u.gender="woman" THEN sum(total) END AS lt50w,
CASE WHEN u.born > 1954 AND u.born <= 1964 AND u.gender="man" THEN sum(total) END AS lt60m,
CASE WHEN u.born > 1954 AND u.born <= 1964 AND u.gender="woman" THEN sum(total) END AS lt60w,
CASE WHEN u.born <= 1954 AND u.gender="man" THEN sum(total) END AS gt60m,
CASE WHEN u.born <= 1954 AND u.gender="woman" THEN sum(total) END AS gt60w
WITH collect(lt20m) AS lt20am,
collect(lt20w) AS lt20aw,
collect(lt30m) AS lt30am,
collect(lt30w) AS lt30aw,
collect(lt40m) AS lt40am,
collect(lt40w) AS lt40aw,
collect(lt50m) AS lt50am,
collect(lt50w) AS lt50aw,
collect(lt60m) AS lt60am,
collect(lt60w) AS lt60aw,
collect(gt60m) AS gt60am,
collect(gt60w) AS gt60aw
RETURN
head(lt20am) AS 男年齢20以下,
head(lt20aw) AS 女年齢20以下,
head(lt30am) AS 男年齢30以下,
head(lt30aw) AS 女年齢30以下,
head(lt40am) AS 男年齢40以下,
head(lt40aw) AS 女年齢40以下,
head(lt50am) AS 男年齢50以下,
head(lt50aw) AS 女年齢50以下,
head(lt60am) AS 男年齢60以下,
head(lt60aw) AS 女年齢60以下,
head(gt60am) AS 男年齢60上,
head(gt60aw) AS 女年齢60上
男年齢20以下 女年齢20以下 男年齢30以下 女年齢30以下 男年齢40以下 女年齢40以下 男年齢50以下 女年齢50以下
男年齢60以下 女年齢60以下 男年齢60上 女年齢60上
2,697,130 3,381,830 5,130,839 5,522,689 5,471,666 3,766,844 5,734,831 4,794,380 5,682,058 4,630,580 3,285,838 3,143,985
クロス集計やってみた2014年9月の年齢別男女別の売
上金額
https://www.creationline.com/lab/10192
75. Neo4j User Group.
様々な規定を機能がインストールするだけで簡単に使える(300近いの機能)。
• APOC(A Package Of Componen)
https://neo4j-contrib.github.io/neo4j-apoc-procedures/index33.html
• 例えば、foo@bar.comからドメインだけを切り出すとか
サードパーティーのプロシージャー
75
WITH 'foo@bar.com' AS email
RETURN apoc.data.domain(email) as value // will
return 'bar.com'<
value
"bar.com"