サービスのサーバ設定・管理
HTML+CSS+JavaScriptのコーディング
・・・などをやっています。
グラフデータベースで扱えるのはグラフと木構造
何かのネットワークまたは何かの相関関係
MySQL / PostgreSQL / SQLite /
Oracle Database / Microsoft SQL Server
etc...
https://ja.wikipedia.org/wiki/データベース管理システム
https://ja.wikipedia.org/wiki/NoSQL
https://neo4j.com/customers/
https://medium.com/@c_z/「パナマ文書」解析の技術的側面-d10201bbe195#.8gbo4jc8n
https://neo4j.com/blog/analyzing-panama-papers-neo4j/
CSVやTSVで、「Node1」「Node2」「Edge」のリストを用意する。
JSONやXMLでももちろんOKです。
From | To | $ |
---|---|---|
A | B | 30000 |
A | C | 10000 |
A | D | 10000 |
B | D | 50000 |
D | E | 100000 |
D | F | 20000 |
C | D | 30000 |
・ ・ ・ |
CSVであればロード用のコマンドラインツールも付属しています。
が、データサイズに比例してメモリ消費が増えたり、プロパティが多くなるとコマンドのオプションも複雑になるので、
何かしらの言語でパースしながらロードするほうがやりやすく感じます。
CREATE (n:Person { name: 'A' })
CREATE (n:Person { name: 'B' })
CREATE (n:Person { name: 'C' })
CREATE (n:Person { name: 'D' })
CREATE (n:Person { name: 'E' })
CREATE (n:Person { name: 'F' })
CREATE (n:Person { name: 'G' })
CREATE (n:Person { name: 'H' })
CREATE (n:Person { name: 'I' })
CREATE (n:Person { name: 'J' })
MATCH (a:Person),(b:Person) WHERE a.name = 'A' AND b.name = 'B' CREATE (a)-[r:rel {price: 30000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'A' AND b.name = 'C' CREATE (a)-[r:rel {price: 10000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'A' AND b.name = 'D' CREATE (a)-[r:rel {price: 10000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'B' AND b.name = 'D' CREATE (a)-[r:rel {price: 50000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'D' AND b.name = 'E' CREATE (a)-[r:rel {price: 100000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'D' AND b.name = 'F' CREATE (a)-[r:rel {price: 20000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'C' AND b.name = 'D' CREATE (a)-[r:rel {price: 30000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'D' AND b.name = 'B' CREATE (a)-[r:rel {price: 10000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'F' AND b.name = 'G' CREATE (a)-[r:rel {price: 50000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'F' AND b.name = 'H' CREATE (a)-[r:rel {price: 10000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'C' AND b.name = 'I' CREATE (a)-[r:rel {price: 20000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'I' AND b.name = 'J' CREATE (a)-[r:rel {price: 30000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'F' AND b.name = 'J' CREATE (a)-[r:rel {price: 20000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'I' AND b.name = 'F' CREATE (a)-[r:rel {price: 10000}]->(b)
MATCH (a:Person),(b:Person) WHERE a.name = 'G' AND b.name = 'J' CREATE (a)-[r:rel {price: 10000}]->(b)
require 'neo4j-core'
tsv_file = ARGV[0]
neo4jpwd = ARGV[1]
Neo4j::Session.open(:server_db, "http://neo4j:#{neo4jpwd}@localhost:7474")
nodes = []
relations = []
File.open(tsv_file).each_line do |l|
person_from, person_to, price = l.chomp.split("\t")
relations.push([person_from, person_to, price.to_i])
nodes.push(person_from, person_to)
end
nodes.uniq.each do |node|
Neo4j::Node.create({name: node})
end
relations.uniq.each do |rel|
nodeFrom = Neo4j::Label.find_nodes(:node, :name, rel[0])
nodeTo = Neo4j::Label.find_nodes(:node, :name, rel[1])
nodeFrom.each do |n1|
nodeTo.each do |n2|
n1.create_rel(:rel, n2, price: rel[2])
end
end
end
http://localhost:7474
MATCH n=()-[r:rel]->() WHERE r.price >= 30000 RETURN n
MATCH (a{name: 'A'})-[]->(b) RETURN b
MATCH n=({name: 'A'})-[:rel*..10]->() RETURN n
MATCH n = (a{name: 'A'})-[:rel*]->(b{name: 'E'}) RETURN COUNT(n)
*グラフなので、かなり容易に組み合わせ爆発が起こります。
そのため、あまり長い探索は現実的な時間内では終わりません。
10ステップくらいでLIMITをかけておくのが無難です。
W3Cが標準化したWeb上のリソースの記述方式
トリプルで表現する
NY
つまりグラフ
同じくW3Cが標準化したSPARQLという言語で検索できる
https://ja.wikipedia.org/wiki/Resource_Description_Framework
https://www.w3.org/wiki/SparqlEndpoints
http://ja.dbpedia.org/
ブラウザAPIから入力してみてもいいし、POSTでリクエストを投げてJSONやXMLを受け取ってもいい。
形に当てはめるようなクエリ
SELECT DISTINCT *
WHERE {
<http://ja.dbpedia.org/resource/新潟県> ?p ?o .
}
SELECT DISTINCT *
WHERE {
?s ?p <http://ja.dbpedia.org/resource/新潟県> .
}
他にもありますが、だいたいこのへんに落ち着くことが多いです。
これも他にもたくさんありますが、使ったことがあって紹介したいものはこんなところです。