SlideShare a Scribd company logo
INTELLIGENCE, Ltd
©2012 INTELLIGENCE, Ltd. All Rights Reserved.
INTELLIGENCE, Ltd
©2012 INTELLIGENCE, Ltd. All Rights Reserved.
Neo4jの
「データ操作プログラミング」から
「ビジュアライズ」まで
2016.01.25
清田 馨一郎
自己紹介
【名前】
清田 馨一郎 (@seikei1874)
【所属】
キャリアDiv.
マーケティング企画統括部
データアナリティクス部
マーケティングテクノロジーグループ
【経歴】
2002年 受託メインの会社に入社
PGから叩き上げでPMまで経験
大手企業の基幹システムからソーシャルゲーム開発まで幅広く経験
2014年4月からインテリジェンスへJOIN
部門内のKPI集計、見える化を進めるシステムの開発、運用を担当
石抱き
これから話す内容は、個人の見解であり、
所属する組織、団体の見解ではありません。
「At your own risk」でお願いします。
3 | 25-Jan-16 |
Neo4jの利用
サイト流入、回遊状況の集計
 一時的にNeo4jに格納し、集計を簡単にしている
サイト回遊状況の可視化
 まだ、実験段階
なぜ、Neo4jを利用したのか?
 遷移数が「不定」なので、RDBでは難易度が高いと思った
4 | 25-Jan-16 |
Rest API /
組み込み(Embedded) API
5 | 25-Jan-16 |
アーキテクチャ図
6 | 25-Jan-16 |
組み込みAPI REST API
JAVA
(もしくは、Scala、Groovy
などJAVA APIが利用できる
言語)
Neo4jサーバー
アプリケーション
プログラミング言語
REST API
クライアント
データファイル
Neo4j
REST APIと組み込みAPI
REST API
 Neo4jサーバを起動すれば、即利用可能
 REST APIなので、クライアンの言語、FWは問わない
 他サーバから呼べる
 HTTP通信、REST解析が行わるので、若干遅い
 基本は、こちらを利用する
組み込みAPI(EmbeddedAPI)
 JAVA API(JVMで動く言語から利用可)
 同じサーバからのみ
 Neo4jをデータストアとして利用し、大量、高速に処理したい
 ServerAPIを作成したい
7 | 25-Jan-16 |
集計できるまで
データ量
 1日分 120万件くらい(計測したい部分のみ)
 Mac Book Proで開発
最初
 Cypherで、CSVインポート
 丸一日でも終わらない
 1ページを1ノードとして作成したので、特定のノード間で、数万エッジと偏りが生じる
 終端ノードを取得する検索で、偏っていたエッジを全探索していた
ReTry(2回目)
 1PVを1ノードに変更
 13時間くらい
 終端ノードの検索が遅い
8 | 25-Jan-16 |
集計できるまで
ReTry(3回目)
 組み込みAPIを利用
 5時間くらい
 やはり、終端ノードを検索するクエリが遅い
ReTry(4回目)
 投入データの前処理で、ユーザ毎に時系列で並べ替える
 終端ノードの検索はしないで、追加した終端ノードを保持するように変更
 30分くらい
 更に並列処理化して、4,5分程度に収める
 最大で2億ノードくらいある状態でも実行したが処理速度は、それほど変わらなかった
9 | 25-Jan-16 |
Neo4j REST API
OGM(Object Graph Mapper)
 SDN4(Spring Data Neo4j)
http://projects.spring.io/spring-data-neo4j/
JavaのアプリケーションFWでは、一般的なSpringFrameworkのコンポーネント
OGMベース。GraphAwareの社員がフルコミットで開発している。
この社員はOGMのコミッターなので、Javaでの開発であれば、SDN4を選択すべき
GraphAware
 Neo4jに関することを主力とした英国のベンチャー
 Neo4j関連のOSSを多数公開している
http://graphaware.com/products/
 GraphAware Framework
https://github.com/graphaware/neo4j-framework/
10 | 25-Jan-16 |
Neo4j JDBC
 https://github.com/neo4j-contrib/neo4j-jdbc
JDBCドライバ経由で、REST APIと通信できる
アプリケーションでの利用は現実的で無く、
DBのビジュアルツールのドライバとして使用すべき
DataNucleus
 様々なDBのORMライブラリ群らしい
Py2Neo、neo4jPHPなど、様々な言語のFWがある
詳しくは、Neo4jデベロッパーサイト
 http://neo4j.com/developer/language-guides/
11 | 25-Jan-16 |
OGMのサンプルソース
12 | 25-Jan-16 |
OGM サンプル
src
└ main
├── java
│ └── jp
│ └── co
│ └── inte
│ ├── Neo4JOGMSample.java
│ ├── Neo4jSessionFactory.java
│ ├── domain
│ │ ├── nodes
│ │ │ ├── Movie.java
│ │ │ └── Person.java
│ │ └── relationships
│ │ ├── Acted.java
│ │ └── Directed.java
│ └── service
│ ├── GenericService.java
│ ├── PersonService.java
│ ├── Service.java
│ └── impl
│ └── PersonServiceImpl.java
└── resources
13 | 25-Jan-16 |
Neo4jOGMSample.java
14 | 25-Jan-16 |
/**
* 1956年生まれの俳優/女優の名前と、出演した映画のタイトルを出演します。
*/
public class Neo4JOGMSample {
public static void main(String... args) {
PersonService service = new PersonServiceImpl();
Iterable p = service.findByBorn(1956);
p.forEach(person -> {
System.out.print(person.getName());
// Personノードから「ACTED_IN」でリレーションシップされているMovieノードを取得
List acteds = person.getActed();
acteds.forEach( acted -> {
System.out.print(" : " + acted.getMovie().getTitle());
});
System.out.println();
});
}
}
Neo4jSessionFactory.java
15 | 25-Jan-16 |
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
public class Neo4jSessionFactory {
// Entityクラスがあるパッケージ名を渡す
private final static SessionFactory sessionFactory =
new SessionFactory("jp.co.inte.domain.nodes", "jp.co.inte.domain.relationships");
private static Neo4jSessionFactory factory = new Neo4jSessionFactory();
public static Neo4jSessionFactory getInstance() {
return factory;
}
private Neo4jSessionFactory() {
}
public Session getNeo4jSession() {
return sessionFactory.openSession("http://localhost:7474", "neo4j", "neo");
}
}
GenericService.java
16 | 25-Jan-16 |
public abstract class GenericService<T> implements Service<T> {
private static final int DEPTH_LIST = 0;
private static final int DEPTH_ENTITY = 2;
private Session session = Neo4jSessionFactory.getInstance().getNeo4jSession();
@Override
public Iterable<T> findAll() {
return session.loadAll(getEntityType(), DEPTH_LIST);
}
@Override
public T find(Long id) {
return session.load(getEntityType(), id, DEPTH_ENTITY);
}
public abstract Class<T> getEntityType();
}
PersonServiceImpl.java
17 | 25-Jan-16 |
public class PersonServiceImpl extends GenericService<Person> implements PersonService {
@Override
public Iterable<Person> findByBorn(int born) {
/**
* リレーションシップも返さないとNodeEntityクラスのRelationshipに値が入らないので注意
*/
String query = "MATCH (p:Person)-[a:ACTED_IN|DIRECTED]->() where p.born = {born} return p,a";
Session session = Neo4jSessionFactory.getInstance().getNeo4jSession();
Map<String, Integer> params = new HashMap<>();
params.put("born", born);
return session.query(getEntityType(), query, params);
}
@Override
public Class<Person> getEntityType() {
return Person.class;
}
}
ノードのドメイン
18 | 25-Jan-16 |
/*
* アノテーションでLABEL、ノードのプロパティ、リレーションシップタイプなどを指定します。
*/
@NodeEntity(label = "Movie")
public class Movie {
@GraphId
private Long id;
@Property(name = "title")
private String title;
@Property(name = "tagline")
private String tagline;
@Property(name = "released")
private Integer released;
@Relationship(type = "ACTED_IN", direction = "INCOMING")
private Person person;
/**
Getter、Setterは省略
**/
}
リレーションシップのドメイン
19 | 25-Jan-16 |
/*
* リレーションシップのエンティティでは、開始、終了ノードもアノテーションで指定できます。
*/
@RelationshipEntity(type = "ACTED_IN")
public class Acted {
@GraphId
private Long id;
@Property(name = "roles")
private List<String> roles;
@StartNode private Person person;
@EndNode private Movie movie;
/**
略
*/
}
Embedded API
サンプルソース
20 | 25-Jan-16 |
Embedded API
21 | 25-Jan-16 |
/**
* Neo4J起動
*/
GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory()
.newEmbeddedDatabaseBuilder(Paths.get("").toFile())
.newGraphDatabase();
/**
* 実行中にNeo4j Shellで接続可能
*/
GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory()
.newEmbeddedDatabaseBuilder(Paths.get("").toFile())
.setConfig(ShellSettings.remote_shell_enabled, "true")
.setConfig(ShellSettings.remote_shell_port, "5555")
.setConfig(ShellSettings.remote_shell_read_only, "true")
.newGraphDatabase();
// 終了
graphDatabaseService.shutdown();
22 | 25-Jan-16 |
/*
* Ctrl-Cなどの停止が発生した場合の処理
* Neo4Jへの接続を停止する。
*/
private static void registerShutdownHook(final GraphDatabaseService graphDatabaseService) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
graphDatabaseService.shutdown();
}
});
}
// 起動したNeo4jのインスタンスを渡す
registerShutdownHook(graphDatabaseService);
23 | 25-Jan-16 |
try (Transaction transaction = graphDatabaseService.beginTx()) {
// ノードの作成
Node startNode = graphDatabaseService.createNode(DynamicLabel.label("LABEL"));
Node endNode = graphDatabaseService.createNode(DynamicLabel.label("LABEL"));
// リレーションシップの作成
Relationship rel = startNode.createRelationshipTo(endNode, DynamicRelationshipType.withName("TYPE"));
// successs設定しないとプロパティを更新できない
transaction.success();
// プロパティの設定
startNode.setProperty("property", "value");
rel.setProperty("property", "value");
transaction.success();
}
24 | 25-Jan-16 |
for (Path path : traversal.traverse(node)) {
pages.add((String) path.endNode().getProperty("url"));
}
// トラバーサル
TraversalDescription traversal = graphDatabaseService.traversalDescription()
.relationships(DynamicRelationshipType.withName("TYPE"), Direction.OUTGOING)
.evaluator(path -> {
Node node = path.endNode();
// 特定のラベルを持っていなければ含まない
if (!node.hasLabel(DynamicLabel.label("LABEL"))) {
return Evaluation.EXCLUDE_AND_CONTINUE;
}
// 目的のプロパティを持っていたら、以降は枝切り
String url = (String) node.getProperty("url");
if (url.matches(".*HOGE.*")) {
return Evaluation.INCLUDE_AND_PRUNE;
}
return Evaluation.INCLUDE_AND_CONTINUE;
});
REST API
 Neo4Jサーバを起動すれば、即利用可能
 REST APIなので、クライアンの言語、FWは問わない
 他サーバから呼べる
 HTTP通信、REST解析が行わるので、若干遅い
 基本は、こちらを利用する
組み込みAPI(EmbeddedAPI)
 JAVA API(JVMで動く言語から利用可)
 同じサーバからのみ
 Neo4jをデータストアとして利用し、大量、高速に処理したい
 ServerAPIを作成したい
25 | 25-Jan-16 |
26 | 25-Jan-16 |
Server Plugin/
Unmanaged Extension
最初に まとめ
標準のREST APIとCypherの組み合わせで十分なことが多いが
パフォーマンスや、トラーバサルを細かく定義したい場合がある
Embedded APIを利用すればパフォーマンスの問題は解決できるが
Serverモードとの併用ができない
REST API経由でEmbedded APIが利用できるServer APIを自作する
Server APIは、「Server Plugin」「Unmanaged Extension」
「Unmanaged Extension」は、Neo4jの管轄外となる
 どのような影響があるが把握していないが、オフィシャルでは利用を推奨していない
「Unmanaged Extension」では、JSON以外で返せる
27 | 25-Jan-16 |
アーキテクチャ図
28 | 25-Jan-16 |
Neo4j サーバ
REST
クライア
ント
REST サーバ
(JAX-RS)
Neo4jのREST API
Unmanaged
Extension
Server Plugin
Embedded API データ
ファイル
HTTP
HTTP
Server Pluginの作成
Java。「org.neo4j.server.plugins.ServerPlugin」を継承する
継承先から渡される「GraphDatabaseService」を利用して処理する
ServerPluginから返せる値
 Node型
 Relationship型
 Path型
 Java プリミティブ型
 String型
 org.neo4j.server.rest.repr.Representation
ServiceLoaderなので、META-INF/services配下に
「org.neo4j.server.plugins.ServerPlugin」ファイルを作成し、
そのファイルにpluginにしたいクラスを記述する
$ cat src/main/resources/META-INF/services/org.neo4j.server.plugins.ServerPlugin
jp.co.inte.Sample
jarを作成して、${NEO4J_HOME}/pluginに配置する
29 | 25-Jan-16 |
30 | 25-Jan-16 |
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Result;
import org.neo4j.graphdb.Transaction;
import org.neo4j.server.plugins.Name;
import org.neo4j.server.plugins.PluginTarget;
import org.neo4j.server.plugins.ServerPlugin;
import org.neo4j.server.plugins.Source;
public class Sample extends ServerPlugin {
@Name("plugin_sample")
@PluginTarget(GraphDatabaseService.class)
public Long count(@Source GraphDatabaseService graphDb) {
Long count = 0L;
try(Transaction tx = graphDb.beginTx()) {
Result result = graphDb.execute("MATCH (n) return count(n) as cnt");
count = result.next();
count = (Long)ret.get("cnt");
}
return count;
}
}
31 | 25-Jan-16 |
$ curl http://localhost:7474/db/data/
{
"extensions" : {
"Sample" : {
"plugin_sample" : "http://localhost:7474/db/data/ext/Sample/graphdb/plugin_sample"
}
},
"node" : "http://localhost:7474/db/data/node", "node_index" :
"http://localhost:7474/db/data/index/node", "relationship_index" :
"http://localhost:7474/db/data/index/relationship", "extensions_info" :
"http://localhost:7474/db/data/ext", "relationship_types" :
"http://localhost:7474/db/data/relationship/types", "batch" :
"http://localhost:7474/db/data/batch", "cypher" : "http://localhost:7474/db/data/cypher",
"indexes" : "http://localhost:7474/db/data/schema/index", "constraints" :
"http://localhost:7474/db/data/schema/constraint", "transaction" :
"http://localhost:7474/db/data/transaction", "node_labels" :
"http://localhost:7474/db/data/labels", "neo4j_version" : "2.3.0"
}
Unmanaged Extensionの作成
32 | 25-Jan-16 |
package jp.co.inte;
import org.neo4j.graphdb.GraphDatabaseService;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.nio.charset.Charset;
@Path("/helloworld")
public class UnmanagedPluginSample {
private final GraphDatabaseService graphDatabaseService;
public UnmanagedPluginSample(@Context GraphDatabaseService graphDatabaseService) {
this.graphDatabaseService = graphDatabaseService;
}
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/{nodeId}")
public Response hello(@PathParam("nodeId") long nodeId) {
return Response.status(Response.Status.OK).entity(
("Hello World, nodeId=" + nodeId).getBytes( Charset.forName("UTF-8") )
).build();
}
}
Unmanaged Extensionの作成
「neo4j-server.properties」に呼び出したいExtensionを記述する
org.neo4j.server.thirdparty_jaxrs_classes=jp.co.inte=/sample/unmanage
この例では、パッケージ「jp.co.inte」にあるクラス群を
「/sample/unmanage」で呼ぶ定義。
サンプルコードのパスは「/sample/unmanage/helloworld」となる。
33 | 25-Jan-16 |
もう一度 まとめ
標準のREST APIとCypherの組み合わせで十分なことが多いが
パフォーマンスや、トラーバサルを細かく定義したい場合がある
Embedded APIを利用すればパフォーマンスの問題は解決できるが
Serverモードとの併用ができない
REST API経由でEmbedded APIが利用できるServer APIを自作する
Server APIは、「Server Plugin」「Unmanaged Extension」
「Unmanaged Extension」は、Neo4jの管轄外となる
 どのような影響があるが把握していないが、オフィシャルでは利用を推奨していない
「Unmanaged Extension」では、JSON以外で返せる
34 | 25-Jan-16 |
ビジュアライゼーション
35 | 25-Jan-16 |
ビジュアライゼーション
linkurious.js
https://github.com/Linkurious/linkurious.js
 フランスのベンチャーlinkurious(https://linkurio.us/)が提供している
Sigma.jsベースのJSライブラリ。
 REST API経由で、Cypherを実行してビジュアライズするJavaScriptが標準で用意
36 | 25-Jan-16 |
ビジュアライゼーション
Gephi
https://gephi.wordpress.com/
 ネットワーク分析 GUIツール
 Neo4j Shell-toolsを利用すれば、Gephiで読み込めるデータ形式で出力可能
https://github.com/jexp/neo4j-shell-tools
37 | 25-Jan-16 |
ビジュアライゼーション
Popoto.js
http://www.popotojs.com/
 d3.jsベースのJavaScriptライブラリ
 インタラクティブなデータ探索が可能
38 | 25-Jan-16 |
まとめ
まずは、REST API+RESTフレームワークで検討しよう。
パフォーマンスがでなければ、Server Pluginを検討しよう。
Embeddedモードは最後の手段
 Neo4jをバッチ処理のみに使用するなら、Embeddedモード
ブラウザでビジュアライズしたければ、Linkrious.jsが良い
ネットワーク分析がしたければ、Gephi
39 | 25-Jan-16 |
お願い
知見、試してみた事の共有を是非!!
 GraphAware、DataNucleusの使い方
 ネットワーク分析
 Gephiの使い方
 Spark GraphXとNeo4jの関係性
– GraphXのデータストアにNeo4jが利用できる?
 複雑ネットワーク分析をNeo4jで。
– ネットワークの特徴量、類似性、伝播モデルなどなど
40 | 25-Jan-16 |
41 | 25-Jan-16 |

More Related Content

What's hot

PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
Atsushi KOMIYA
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンス今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンス
Hidenori Ishii
 
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
ippei_suzuki
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
Masahiro Tomita
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
Shinsuke Sugaya
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 
LIFULL HOME'SでのSolrの構成と運用の変遷
LIFULL HOME'SでのSolrの構成と運用の変遷LIFULL HOME'SでのSolrの構成と運用の変遷
LIFULL HOME'SでのSolrの構成と運用の変遷
LIFULL Co., Ltd.
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
Recruit Technologies
 
Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界
Yuki Morishita
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道
Shinsuke Sugaya
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
Kouhei Sutou
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
ビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分けビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分け
Recruit Technologies
 

What's hot (20)

PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンス今さらだけどMySQLとライセンス
今さらだけどMySQLとライセンス
 
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
LIFULL HOME'SでのSolrの構成と運用の変遷
LIFULL HOME'SでのSolrの構成と運用の変遷LIFULL HOME'SでのSolrの構成と運用の変遷
LIFULL HOME'SでのSolrの構成と運用の変遷
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
 
Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
ビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分けビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分け
 

Viewers also liked

The Graph Traversal Programming Pattern
The Graph Traversal Programming PatternThe Graph Traversal Programming Pattern
The Graph Traversal Programming Pattern
Marko Rodriguez
 
Neo4j を Javaプログラムから使う
Neo4j を Javaプログラムから使うNeo4j を Javaプログラムから使う
Neo4j を Javaプログラムから使う
Masahiro Satake
 
Alfresco勉強会#25 ワークフロー入門
Alfresco勉強会#25 ワークフロー入門Alfresco勉強会#25 ワークフロー入門
Alfresco勉強会#25 ワークフロー入門Takeshi Totani
 
(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ
Mitsutoshi Kiuchi
 
Cytoscapeの現状とCyberinfrastructure
Cytoscapeの現状とCyberinfrastructureCytoscapeの現状とCyberinfrastructure
Cytoscapeの現状とCyberinfrastructure
Keiichiro Ono
 
Python neo4j cytoscapejsでデータ可視化入門
Python neo4j cytoscapejsでデータ可視化入門Python neo4j cytoscapejsでデータ可視化入門
Python neo4j cytoscapejsでデータ可視化入門
Nao Oec
 
SQLまで使える高機能NoSQLであるCouchbase Serverの勉強会資料
SQLまで使える高機能NoSQLであるCouchbase Serverの勉強会資料SQLまで使える高機能NoSQLであるCouchbase Serverの勉強会資料
SQLまで使える高機能NoSQLであるCouchbase Serverの勉強会資料
樽八 仲川
 

Viewers also liked (7)

The Graph Traversal Programming Pattern
The Graph Traversal Programming PatternThe Graph Traversal Programming Pattern
The Graph Traversal Programming Pattern
 
Neo4j を Javaプログラムから使う
Neo4j を Javaプログラムから使うNeo4j を Javaプログラムから使う
Neo4j を Javaプログラムから使う
 
Alfresco勉強会#25 ワークフロー入門
Alfresco勉強会#25 ワークフロー入門Alfresco勉強会#25 ワークフロー入門
Alfresco勉強会#25 ワークフロー入門
 
(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ
 
Cytoscapeの現状とCyberinfrastructure
Cytoscapeの現状とCyberinfrastructureCytoscapeの現状とCyberinfrastructure
Cytoscapeの現状とCyberinfrastructure
 
Python neo4j cytoscapejsでデータ可視化入門
Python neo4j cytoscapejsでデータ可視化入門Python neo4j cytoscapejsでデータ可視化入門
Python neo4j cytoscapejsでデータ可視化入門
 
SQLまで使える高機能NoSQLであるCouchbase Serverの勉強会資料
SQLまで使える高機能NoSQLであるCouchbase Serverの勉強会資料SQLまで使える高機能NoSQLであるCouchbase Serverの勉強会資料
SQLまで使える高機能NoSQLであるCouchbase Serverの勉強会資料
 

Similar to Neo4j の「データ操作プログラミング」から 「ビジュアライズ」まで

日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
griddb
 
Apexデザインパターン
ApexデザインパターンApexデザインパターン
Apexデザインパターン
Salesforce Developers Japan
 
red-hat-forum-2017-openshift-baremetal-deployment
red-hat-forum-2017-openshift-baremetal-deploymentred-hat-forum-2017-openshift-baremetal-deployment
red-hat-forum-2017-openshift-baremetal-deployment
Tetsuya Sodo
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for JavaTakuya Tsuchida
 
HBaseとSparkでセンサーデータを有効活用 #hbasejp
HBaseとSparkでセンサーデータを有効活用 #hbasejpHBaseとSparkでセンサーデータを有効活用 #hbasejp
HBaseとSparkでセンサーデータを有効活用 #hbasejp
FwardNetwork
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
Yuji Takayama
 
JavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, PerformanceJavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, Performance
クラスメソッド株式会社
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
Yuji Takayama
 
zabbixを使ったクラウド環境の監視とツール連携
zabbixを使ったクラウド環境の監視とツール連携zabbixを使ったクラウド環境の監視とツール連携
zabbixを使ったクラウド環境の監視とツール連携
NHN テコラス株式会社
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Yoshifumi Kawai
 
OSC2014.Enterprise Zabbix-JobScheduler連携ツールHyClopsJobMonitoringによる運用システムOSS化の実現
OSC2014.Enterprise Zabbix-JobScheduler連携ツールHyClopsJobMonitoringによる運用システムOSS化の実現OSC2014.Enterprise Zabbix-JobScheduler連携ツールHyClopsJobMonitoringによる運用システムOSS化の実現
OSC2014.Enterprise Zabbix-JobScheduler連携ツールHyClopsJobMonitoringによる運用システムOSS化の実現
Daisuke Ikeda
 
ApexトリガのBest Practiceを目指して
ApexトリガのBest Practiceを目指してApexトリガのBest Practiceを目指して
ApexトリガのBest Practiceを目指して
Takahiro Yonei
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
 
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことアプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なこと
Takao Sumitomo
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
Yuji Takayama
 
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 revWindows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 revShotaro Suzuki
 
StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践
Shu Sugimoto
 
I Log On Saa S
I Log On Saa SI Log On Saa S
I Log On Saa Stotty jp
 

Similar to Neo4j の「データ操作プログラミング」から 「ビジュアライズ」まで (20)

日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
 
Apexデザインパターン
ApexデザインパターンApexデザインパターン
Apexデザインパターン
 
red-hat-forum-2017-openshift-baremetal-deployment
red-hat-forum-2017-openshift-baremetal-deploymentred-hat-forum-2017-openshift-baremetal-deployment
red-hat-forum-2017-openshift-baremetal-deployment
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
 
HBaseとSparkでセンサーデータを有効活用 #hbasejp
HBaseとSparkでセンサーデータを有効活用 #hbasejpHBaseとSparkでセンサーデータを有効活用 #hbasejp
HBaseとSparkでセンサーデータを有効活用 #hbasejp
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
JavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, PerformanceJavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, Performance
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
zabbixを使ったクラウド環境の監視とツール連携
zabbixを使ったクラウド環境の監視とツール連携zabbixを使ったクラウド環境の監視とツール連携
zabbixを使ったクラウド環境の監視とツール連携
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
OSC2014.Enterprise Zabbix-JobScheduler連携ツールHyClopsJobMonitoringによる運用システムOSS化の実現
OSC2014.Enterprise Zabbix-JobScheduler連携ツールHyClopsJobMonitoringによる運用システムOSS化の実現OSC2014.Enterprise Zabbix-JobScheduler連携ツールHyClopsJobMonitoringによる運用システムOSS化の実現
OSC2014.Enterprise Zabbix-JobScheduler連携ツールHyClopsJobMonitoringによる運用システムOSS化の実現
 
ApexトリガのBest Practiceを目指して
ApexトリガのBest Practiceを目指してApexトリガのBest Practiceを目指して
ApexトリガのBest Practiceを目指して
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことアプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なこと
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 revWindows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
 
StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践
 
I Log On Saa S
I Log On Saa SI Log On Saa S
I Log On Saa S
 

Recently uploaded

FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 

Recently uploaded (16)

FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 

Neo4j の「データ操作プログラミング」から 「ビジュアライズ」まで

  • 1. INTELLIGENCE, Ltd ©2012 INTELLIGENCE, Ltd. All Rights Reserved. INTELLIGENCE, Ltd ©2012 INTELLIGENCE, Ltd. All Rights Reserved. Neo4jの 「データ操作プログラミング」から 「ビジュアライズ」まで 2016.01.25 清田 馨一郎
  • 2. 自己紹介 【名前】 清田 馨一郎 (@seikei1874) 【所属】 キャリアDiv. マーケティング企画統括部 データアナリティクス部 マーケティングテクノロジーグループ 【経歴】 2002年 受託メインの会社に入社 PGから叩き上げでPMまで経験 大手企業の基幹システムからソーシャルゲーム開発まで幅広く経験 2014年4月からインテリジェンスへJOIN 部門内のKPI集計、見える化を進めるシステムの開発、運用を担当 石抱き
  • 5. Rest API / 組み込み(Embedded) API 5 | 25-Jan-16 |
  • 6. アーキテクチャ図 6 | 25-Jan-16 | 組み込みAPI REST API JAVA (もしくは、Scala、Groovy などJAVA APIが利用できる 言語) Neo4jサーバー アプリケーション プログラミング言語 REST API クライアント データファイル Neo4j
  • 7. REST APIと組み込みAPI REST API  Neo4jサーバを起動すれば、即利用可能  REST APIなので、クライアンの言語、FWは問わない  他サーバから呼べる  HTTP通信、REST解析が行わるので、若干遅い  基本は、こちらを利用する 組み込みAPI(EmbeddedAPI)  JAVA API(JVMで動く言語から利用可)  同じサーバからのみ  Neo4jをデータストアとして利用し、大量、高速に処理したい  ServerAPIを作成したい 7 | 25-Jan-16 |
  • 8. 集計できるまで データ量  1日分 120万件くらい(計測したい部分のみ)  Mac Book Proで開発 最初  Cypherで、CSVインポート  丸一日でも終わらない  1ページを1ノードとして作成したので、特定のノード間で、数万エッジと偏りが生じる  終端ノードを取得する検索で、偏っていたエッジを全探索していた ReTry(2回目)  1PVを1ノードに変更  13時間くらい  終端ノードの検索が遅い 8 | 25-Jan-16 |
  • 9. 集計できるまで ReTry(3回目)  組み込みAPIを利用  5時間くらい  やはり、終端ノードを検索するクエリが遅い ReTry(4回目)  投入データの前処理で、ユーザ毎に時系列で並べ替える  終端ノードの検索はしないで、追加した終端ノードを保持するように変更  30分くらい  更に並列処理化して、4,5分程度に収める  最大で2億ノードくらいある状態でも実行したが処理速度は、それほど変わらなかった 9 | 25-Jan-16 |
  • 10. Neo4j REST API OGM(Object Graph Mapper)  SDN4(Spring Data Neo4j) http://projects.spring.io/spring-data-neo4j/ JavaのアプリケーションFWでは、一般的なSpringFrameworkのコンポーネント OGMベース。GraphAwareの社員がフルコミットで開発している。 この社員はOGMのコミッターなので、Javaでの開発であれば、SDN4を選択すべき GraphAware  Neo4jに関することを主力とした英国のベンチャー  Neo4j関連のOSSを多数公開している http://graphaware.com/products/  GraphAware Framework https://github.com/graphaware/neo4j-framework/ 10 | 25-Jan-16 |
  • 11. Neo4j JDBC  https://github.com/neo4j-contrib/neo4j-jdbc JDBCドライバ経由で、REST APIと通信できる アプリケーションでの利用は現実的で無く、 DBのビジュアルツールのドライバとして使用すべき DataNucleus  様々なDBのORMライブラリ群らしい Py2Neo、neo4jPHPなど、様々な言語のFWがある 詳しくは、Neo4jデベロッパーサイト  http://neo4j.com/developer/language-guides/ 11 | 25-Jan-16 |
  • 13. OGM サンプル src └ main ├── java │ └── jp │ └── co │ └── inte │ ├── Neo4JOGMSample.java │ ├── Neo4jSessionFactory.java │ ├── domain │ │ ├── nodes │ │ │ ├── Movie.java │ │ │ └── Person.java │ │ └── relationships │ │ ├── Acted.java │ │ └── Directed.java │ └── service │ ├── GenericService.java │ ├── PersonService.java │ ├── Service.java │ └── impl │ └── PersonServiceImpl.java └── resources 13 | 25-Jan-16 |
  • 14. Neo4jOGMSample.java 14 | 25-Jan-16 | /** * 1956年生まれの俳優/女優の名前と、出演した映画のタイトルを出演します。 */ public class Neo4JOGMSample { public static void main(String... args) { PersonService service = new PersonServiceImpl(); Iterable p = service.findByBorn(1956); p.forEach(person -> { System.out.print(person.getName()); // Personノードから「ACTED_IN」でリレーションシップされているMovieノードを取得 List acteds = person.getActed(); acteds.forEach( acted -> { System.out.print(" : " + acted.getMovie().getTitle()); }); System.out.println(); }); } }
  • 15. Neo4jSessionFactory.java 15 | 25-Jan-16 | import org.neo4j.ogm.session.Session; import org.neo4j.ogm.session.SessionFactory; public class Neo4jSessionFactory { // Entityクラスがあるパッケージ名を渡す private final static SessionFactory sessionFactory = new SessionFactory("jp.co.inte.domain.nodes", "jp.co.inte.domain.relationships"); private static Neo4jSessionFactory factory = new Neo4jSessionFactory(); public static Neo4jSessionFactory getInstance() { return factory; } private Neo4jSessionFactory() { } public Session getNeo4jSession() { return sessionFactory.openSession("http://localhost:7474", "neo4j", "neo"); } }
  • 16. GenericService.java 16 | 25-Jan-16 | public abstract class GenericService<T> implements Service<T> { private static final int DEPTH_LIST = 0; private static final int DEPTH_ENTITY = 2; private Session session = Neo4jSessionFactory.getInstance().getNeo4jSession(); @Override public Iterable<T> findAll() { return session.loadAll(getEntityType(), DEPTH_LIST); } @Override public T find(Long id) { return session.load(getEntityType(), id, DEPTH_ENTITY); } public abstract Class<T> getEntityType(); }
  • 17. PersonServiceImpl.java 17 | 25-Jan-16 | public class PersonServiceImpl extends GenericService<Person> implements PersonService { @Override public Iterable<Person> findByBorn(int born) { /** * リレーションシップも返さないとNodeEntityクラスのRelationshipに値が入らないので注意 */ String query = "MATCH (p:Person)-[a:ACTED_IN|DIRECTED]->() where p.born = {born} return p,a"; Session session = Neo4jSessionFactory.getInstance().getNeo4jSession(); Map<String, Integer> params = new HashMap<>(); params.put("born", born); return session.query(getEntityType(), query, params); } @Override public Class<Person> getEntityType() { return Person.class; } }
  • 18. ノードのドメイン 18 | 25-Jan-16 | /* * アノテーションでLABEL、ノードのプロパティ、リレーションシップタイプなどを指定します。 */ @NodeEntity(label = "Movie") public class Movie { @GraphId private Long id; @Property(name = "title") private String title; @Property(name = "tagline") private String tagline; @Property(name = "released") private Integer released; @Relationship(type = "ACTED_IN", direction = "INCOMING") private Person person; /** Getter、Setterは省略 **/ }
  • 19. リレーションシップのドメイン 19 | 25-Jan-16 | /* * リレーションシップのエンティティでは、開始、終了ノードもアノテーションで指定できます。 */ @RelationshipEntity(type = "ACTED_IN") public class Acted { @GraphId private Long id; @Property(name = "roles") private List<String> roles; @StartNode private Person person; @EndNode private Movie movie; /** 略 */ }
  • 21. Embedded API 21 | 25-Jan-16 | /** * Neo4J起動 */ GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory() .newEmbeddedDatabaseBuilder(Paths.get("").toFile()) .newGraphDatabase(); /** * 実行中にNeo4j Shellで接続可能 */ GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory() .newEmbeddedDatabaseBuilder(Paths.get("").toFile()) .setConfig(ShellSettings.remote_shell_enabled, "true") .setConfig(ShellSettings.remote_shell_port, "5555") .setConfig(ShellSettings.remote_shell_read_only, "true") .newGraphDatabase(); // 終了 graphDatabaseService.shutdown();
  • 22. 22 | 25-Jan-16 | /* * Ctrl-Cなどの停止が発生した場合の処理 * Neo4Jへの接続を停止する。 */ private static void registerShutdownHook(final GraphDatabaseService graphDatabaseService) { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { graphDatabaseService.shutdown(); } }); } // 起動したNeo4jのインスタンスを渡す registerShutdownHook(graphDatabaseService);
  • 23. 23 | 25-Jan-16 | try (Transaction transaction = graphDatabaseService.beginTx()) { // ノードの作成 Node startNode = graphDatabaseService.createNode(DynamicLabel.label("LABEL")); Node endNode = graphDatabaseService.createNode(DynamicLabel.label("LABEL")); // リレーションシップの作成 Relationship rel = startNode.createRelationshipTo(endNode, DynamicRelationshipType.withName("TYPE")); // successs設定しないとプロパティを更新できない transaction.success(); // プロパティの設定 startNode.setProperty("property", "value"); rel.setProperty("property", "value"); transaction.success(); }
  • 24. 24 | 25-Jan-16 | for (Path path : traversal.traverse(node)) { pages.add((String) path.endNode().getProperty("url")); } // トラバーサル TraversalDescription traversal = graphDatabaseService.traversalDescription() .relationships(DynamicRelationshipType.withName("TYPE"), Direction.OUTGOING) .evaluator(path -> { Node node = path.endNode(); // 特定のラベルを持っていなければ含まない if (!node.hasLabel(DynamicLabel.label("LABEL"))) { return Evaluation.EXCLUDE_AND_CONTINUE; } // 目的のプロパティを持っていたら、以降は枝切り String url = (String) node.getProperty("url"); if (url.matches(".*HOGE.*")) { return Evaluation.INCLUDE_AND_PRUNE; } return Evaluation.INCLUDE_AND_CONTINUE; });
  • 25. REST API  Neo4Jサーバを起動すれば、即利用可能  REST APIなので、クライアンの言語、FWは問わない  他サーバから呼べる  HTTP通信、REST解析が行わるので、若干遅い  基本は、こちらを利用する 組み込みAPI(EmbeddedAPI)  JAVA API(JVMで動く言語から利用可)  同じサーバからのみ  Neo4jをデータストアとして利用し、大量、高速に処理したい  ServerAPIを作成したい 25 | 25-Jan-16 |
  • 26. 26 | 25-Jan-16 | Server Plugin/ Unmanaged Extension
  • 27. 最初に まとめ 標準のREST APIとCypherの組み合わせで十分なことが多いが パフォーマンスや、トラーバサルを細かく定義したい場合がある Embedded APIを利用すればパフォーマンスの問題は解決できるが Serverモードとの併用ができない REST API経由でEmbedded APIが利用できるServer APIを自作する Server APIは、「Server Plugin」「Unmanaged Extension」 「Unmanaged Extension」は、Neo4jの管轄外となる  どのような影響があるが把握していないが、オフィシャルでは利用を推奨していない 「Unmanaged Extension」では、JSON以外で返せる 27 | 25-Jan-16 |
  • 28. アーキテクチャ図 28 | 25-Jan-16 | Neo4j サーバ REST クライア ント REST サーバ (JAX-RS) Neo4jのREST API Unmanaged Extension Server Plugin Embedded API データ ファイル HTTP HTTP
  • 29. Server Pluginの作成 Java。「org.neo4j.server.plugins.ServerPlugin」を継承する 継承先から渡される「GraphDatabaseService」を利用して処理する ServerPluginから返せる値  Node型  Relationship型  Path型  Java プリミティブ型  String型  org.neo4j.server.rest.repr.Representation ServiceLoaderなので、META-INF/services配下に 「org.neo4j.server.plugins.ServerPlugin」ファイルを作成し、 そのファイルにpluginにしたいクラスを記述する $ cat src/main/resources/META-INF/services/org.neo4j.server.plugins.ServerPlugin jp.co.inte.Sample jarを作成して、${NEO4J_HOME}/pluginに配置する 29 | 25-Jan-16 |
  • 30. 30 | 25-Jan-16 | import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Result; import org.neo4j.graphdb.Transaction; import org.neo4j.server.plugins.Name; import org.neo4j.server.plugins.PluginTarget; import org.neo4j.server.plugins.ServerPlugin; import org.neo4j.server.plugins.Source; public class Sample extends ServerPlugin { @Name("plugin_sample") @PluginTarget(GraphDatabaseService.class) public Long count(@Source GraphDatabaseService graphDb) { Long count = 0L; try(Transaction tx = graphDb.beginTx()) { Result result = graphDb.execute("MATCH (n) return count(n) as cnt"); count = result.next(); count = (Long)ret.get("cnt"); } return count; } }
  • 31. 31 | 25-Jan-16 | $ curl http://localhost:7474/db/data/ { "extensions" : { "Sample" : { "plugin_sample" : "http://localhost:7474/db/data/ext/Sample/graphdb/plugin_sample" } }, "node" : "http://localhost:7474/db/data/node", "node_index" : "http://localhost:7474/db/data/index/node", "relationship_index" : "http://localhost:7474/db/data/index/relationship", "extensions_info" : "http://localhost:7474/db/data/ext", "relationship_types" : "http://localhost:7474/db/data/relationship/types", "batch" : "http://localhost:7474/db/data/batch", "cypher" : "http://localhost:7474/db/data/cypher", "indexes" : "http://localhost:7474/db/data/schema/index", "constraints" : "http://localhost:7474/db/data/schema/constraint", "transaction" : "http://localhost:7474/db/data/transaction", "node_labels" : "http://localhost:7474/db/data/labels", "neo4j_version" : "2.3.0" }
  • 32. Unmanaged Extensionの作成 32 | 25-Jan-16 | package jp.co.inte; import org.neo4j.graphdb.GraphDatabaseService; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.nio.charset.Charset; @Path("/helloworld") public class UnmanagedPluginSample { private final GraphDatabaseService graphDatabaseService; public UnmanagedPluginSample(@Context GraphDatabaseService graphDatabaseService) { this.graphDatabaseService = graphDatabaseService; } @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{nodeId}") public Response hello(@PathParam("nodeId") long nodeId) { return Response.status(Response.Status.OK).entity( ("Hello World, nodeId=" + nodeId).getBytes( Charset.forName("UTF-8") ) ).build(); } }
  • 34. もう一度 まとめ 標準のREST APIとCypherの組み合わせで十分なことが多いが パフォーマンスや、トラーバサルを細かく定義したい場合がある Embedded APIを利用すればパフォーマンスの問題は解決できるが Serverモードとの併用ができない REST API経由でEmbedded APIが利用できるServer APIを自作する Server APIは、「Server Plugin」「Unmanaged Extension」 「Unmanaged Extension」は、Neo4jの管轄外となる  どのような影響があるが把握していないが、オフィシャルでは利用を推奨していない 「Unmanaged Extension」では、JSON以外で返せる 34 | 25-Jan-16 |
  • 37. ビジュアライゼーション Gephi https://gephi.wordpress.com/  ネットワーク分析 GUIツール  Neo4j Shell-toolsを利用すれば、Gephiで読み込めるデータ形式で出力可能 https://github.com/jexp/neo4j-shell-tools 37 | 25-Jan-16 |
  • 39. まとめ まずは、REST API+RESTフレームワークで検討しよう。 パフォーマンスがでなければ、Server Pluginを検討しよう。 Embeddedモードは最後の手段  Neo4jをバッチ処理のみに使用するなら、Embeddedモード ブラウザでビジュアライズしたければ、Linkrious.jsが良い ネットワーク分析がしたければ、Gephi 39 | 25-Jan-16 |
  • 40. お願い 知見、試してみた事の共有を是非!!  GraphAware、DataNucleusの使い方  ネットワーク分析  Gephiの使い方  Spark GraphXとNeo4jの関係性 – GraphXのデータストアにNeo4jが利用できる?  複雑ネットワーク分析をNeo4jで。 – ネットワークの特徴量、類似性、伝播モデルなどなど 40 | 25-Jan-16 |