试用了Neo4j ETL命令行工具
假设条件
ETL是什么意思?
-
- Extract/Transform/Load
-
- 今の現場に入って初めて聞いたけど、EAIとは少し違う様子
ETLとは?データを使って企業の生産性を劇的に向上!【図説付】
Neo4j ETL 是什么?
为什么选择CLI?
我决定记录下可能会在工作中使用的技术验证结果。
为什么UI版成了主力呢,这反过来想不明白。
当与其他系统进行协作时,如果没有Neo4j APP,就无法应用,或者在业务系统中,这样的情况相当困难,但看起来是因为企业版的功能限制了信息的范围。
暂时GitHub的最新版本是V1.3.1,所以需要将其应用于原有的Docker文件。
https://github.com/neo4j-contrib/neo4j-etl/releases
因为Postgres已经在另一个容器中启动了,所以只需要指定container_name并执行,就应该可以了。
首先是映射的JSON输出。
export NEO4J_HOME=/path/to/neo4j-enterprise-3.4.0
mkdir -p /tmp/northwind
$NEO4J_HOME/bin/neo4j-etl generate-metadata-mapping \
--rdbms:url jdbc:postgresql://[container_name]/postgres \
--rdbms:user northwind --rdbms:password northwind \
--rdbms:schema northwind --output-mapping-file /tmp/northwind/mapping.json
请在注意事项中仅停留在数据库名称。虽然手册中写有用户名和密码,但只写到数据库名称。
在下面已经指定了,但为什么在这里也写了,所以不出所料,导致了错误。
执行最后一个命令时发生了错误。
研究结果显示,现象上与此类似。
听说要尝试使用1.4.2版本,但是我发现只有1.3.1版本的时候,似乎几乎没有人使用CLI。
据说在Twitter上询问后,他们会帮我确认,所以我会等一会儿。
@neo4j 我想在Docker上使用带有容器网络的Neo4j ETL CLI。为什么只发布到V1.3.1版本?V1.4.1的桌面版似乎已经解决了连接其他容器失败的问题。https://t.co/IKKCDmqA1e— たくや (@ta_o_zi) 2020年2月4日
在另一个环境中,有Postgres和Neo4j在同一服务器上共存的情况,所以我在那里进行了测试,正常地进行了通信确认。
這個問題
话题有点拖沓,但听我说正题。
关于Neo4j ETL CLI。
-
- 大きく分けて2機能
RDBのテーブル仕様からマッピングJSONファイルを出力する
マッピングファイルからGDBへデータ転送を行う
Configファイルでパラメータ指定したりもできるが、汎用的に作るならパラメータ生成の方がコスト低いかなと思ったのであまり触れない。
生成元数据映射
-
- マッピングJSONを生成するためのコマンド
- 対象DBへのアクセス情報と生成するテーブルを指定できる
考虑到实际使用情况,添加实践性选项。
$NEO4J_HOME/bin/neo4j-etl generate-metadata-mapping \
--rdbms:url jdbc:oracle:thin:@localhost:49161:XE \
--rdbms:user northwind --rdbms:password northwind \
--rdbms:schema northwind --output-mapping-file /tmp/northwind/mapping.json
--exclusion-mode-tables include --tables -l hoge_table,huga_table
可能通过仅从hoge_table和huga_table生成JSON文件来实现。
由于无法正确理解手册中的表指定方法而陷入困境。
可能是因为英语能力不足,所以需要学习。
JSON的规范
-
- これはどこみても見つからなかった。
こちらもNeo4jの中の人の記事を見つけたので聞いてみました。
英語力のなさを痛感したけれどなんとか伝わった様子で返信がないのとNeo4jの編集長なる人物からもいいねがきたので、おそらく存在していない。
@JMHReif This article is easy for me to understand neo4j etl.Where is the specification of the JSON file I quoted?I’ve been looking for it since yesterday… https://t.co/PUBNvY1Kfe— たくや (@ta_o_zi) February 5, 2020
確かにNode、リレーションごとに取得するSQLとマッピング情報が書いてあるだけだから直感的でわかりやすいのだけど、細かいところがわからず生成させては適用してみるの繰り返しだった。
出口
-
- マッピングJSONを読み込んでNeo4jへデータを格納する。
- generate-metadata-mappingのオプションも使えばノンストップでNeo4jへデータ投入できるらしい。
$NEO4J_HOME/bin/neo4j-etl export \
--rdbms:url jdbc:oracle:thin:@localhost:49161:XE \
--rdbms:user northwind --rdbms :password northwind \
--rdbms:schema northwind \
--using bulk:neo4j-import \
--import-tool $NEO4J_HOME/bin \
--csv-directory /tmp/northwind \
--mapping-file /tmp/northwind/mapping.json \
--neo4j:user --neo4j:password
--options-file /tmp/northwind/options.json \
--quote '"' --force
-
- 正常に完了すれば100万件位のデータが8Gメモリのマシンで30秒弱くらいで入ります。
-
- ↑ノードだけなら速いけれど、リレーションを含めたら途端に重くなった
CSVの生成過程をみていたけど、どうやらStartId/EndIdで指定したテーブルを実際にみてチェックをしているからと思う。
问题
-
- 少し遅い?
もっとパフォーマンス出したければKafka(Streams)使った方が良いよという公式のお言葉をどこかでみた気がするのでKafkaもそのうち記事書く。
コンテナ間通信ができない。
localhostになぜかアクセスされる。多分固定。CLI版更新しないかな。
libにおいたneo4j-etl.jarのせいでNeo4jが起動しない
これ、Neo4jはよくあります。libの読み込みエラーはSkipしてほしいけどダメみたい。
今回のケースだと、起動するのにETL Libraryを一旦退避させるという荒技。
本体のソースも読みたいから調べてみるつもり。
SELECT結果のマッピング方法調べ中。
JOINとかしたSQLだとうまく行かなかったのでそこは明日チャレンジ。
这就是全部。
如果最近您变得对这个领域越来越了解,请务必与我们联系,我们可以提供Neo4j学习的机会,并帮助您将您公司的数据转化为图形形式!