2021年6月11日金曜日

neo4jの拡張プラグイン apoc.export.csv.query の例2

sample.csv を cypher-shell で読んで、田中さんの友達グループ Tanaka_G.csvを出力する。

sample.csv
id,name,add,job,relation
a001,田中,東広島,販売,a002
a002,山本,北広島,販売,a003
a003,佐藤,久留米,飲食,a001
a004,山崎,,建設,a002
a005,村上,東久留米,販売,a002
a006,広田,南大東島,醸造,a001

$ sudo neo4j start
$ cypher-shell -u XXXXX -p XXXX

//sample.csvからノードを作成
neo4j@neo4j> LOAD CSV WITH HEADERS FROM 'file:///sample.csv' AS row
             MERGE (p:Person{ID:coalesce(row.id,"Unknown"), NAME:coalesce(row.name,"Unknown"),ADD:coalesce(row.add,"Unknown"), JOB:coalesce(row.job,"Unknown"), REL:coalesce(row.relation,"Unknown")});

//リレーションシップの作成
neo4j@neo4j> load csv with headers from "file:///sample.csv" as row
             match (p1:Person{ID:row.id})
             match (p2:Person{ID:row.relation})
             merge (p1)-[r:Know]->(p2);
0 rows available after 262 ms, consumed after another 0 ms
Created 6 relationshi

// 田中さんグループ Tanaka_G.csv への出力。[:Know]の'*'はrelation shipが続く限り全部。
neo4j@neo4j> with "match (a{NAME:'田中'})-[:Know*]->(b)
             return b.NAME as name, b.ADD as address" as Friends
             call apoc.export.csv.query(Friends, "Tanaka_G.csv",{})
             yield file     // これをしないと
             return file;   // returnが無いエラー
+----------------+
| file           |
+----------------+
| "Tanaka_G.csv" |
+----------------+

1 row available after 21 ms, consumed after another 8 ms

別のターミナルから出力ファイルを見てみる
$ cat Tanaka_G.csv
"name","address"
"山本","北広島"
"佐藤","久留米"
"田中","東広島"
neo4j@neo4j> match (n) detach delete n;
neo4j@neo4j>:quit
$ sudo neo4j stop

---------------------
neo4jブラウザで同じことをやってみる。

// systemctlからneo4jを起動すると、起動表示はなくなる。
$ systemctl start neo4j
ブラウザから localhost:7474 Username:XXXXX Password:XXXXX

nao4j$ LOAD CSV WITH HEADERS FROM 'file:///sample.csv' AS row
       MERGE (p:Person{ID:coalesce(row.id,"Unknown"), NAME:coalesce(row.name,"Unknown"),ADD:coalesce(row.add,"Unknown"), JOB:coalesce(row.job,"Unknown"), REL:coalesce(row.relation,"Unknown")}); // Ctrl+Enter

neo4j$ LOAD CSV WITH HEADERS FROM "file:///sample.csv" AS row
       MATCH (p1:Person{ID:row.id})
       MATCH (p2:Person{ID:row.relation})
       MERGE (p1)-[r:Know]->(p2);  // Ctrl+Enter

// 本題とはちがうけどGraph表示
// neo4j$ MATCH (p1)-[r:Know]->(p2) RETURN p1,r,p2;


neo4j$ MATCH (a{NAME:'田中'})-[r:Know*]->(b) RETURN b.NAME AS name, b.ADD AS address; // Enter
ここで、[ Export CSV ]をクリック

// 本題とはちがうけどGraph表示
// neo4j$ MATCH (a{NAME:'田中'})-[r:Know*]->(b) RETURN a,r,b;
 
ターミナルから出力ファイルを見てみる
$ cat export.csv
name,address
山本,北広島
佐藤,久留米
田中,東広島
neo4j$ MATCH (n) DETACH DELETE n;
Clear local data
$ systemctl stop neo4j

以上、素人の個人的実験でした。

2021年6月10日木曜日

neo4jの拡張プラグイン apoc.export.csv.query の例1

sample.csv を cypher-shell で読んで、ADD(住所)が'広島'の人の名前を result.csvに出力する。

sample.csv
id,name,add,job,relation
a001,田中,東広島,販売,a002
a002,山本,北広島,販売,a003
a003,佐藤,久留米,飲食,a001
a004,山崎,,建設,a002
a005,村上,東久留米,販売,a002
a006,広田,南大東島,醸造,a001
 
$ sudo neo4j start
$ cypher-shell -u neo4j -p XXXX

// coalesce(a,"b") は、セルがaならaを返す。なければ文字列bを返す
neo4j@neo4j> LOAD CSV WITH HEADERS FROM 'file:///sample.csv' AS row
             MERGE (p:Person{ID:coalesce(row.id,"Unknown"), NAME:coalesce(row.name,"Unknown"),ADD:coalesce(row.add,"Unknown"), JOB:coalesce(row.job,"Unknown"), REL:coalesce(row.relation,"Unknown")});

neo4j@neo4j> call apoc.export.csv.query("match (a:Person) where a.ADD contains '広島' return a.NAME, a.ADD", "result.csv", {});
+-------------------------------------------------------------------------------------------------------------------------------------+
| file         | source               | format | nodes | relationships | properties | time | rows | batchSize | batches | done | data |
+-------------------------------------------------------------------------------------------------------------------------------------+
| "result.csv" | "statement: cols(2)" | "csv"  | 0     | 0             | 4          | 1    | 2    | 20000     | 1       | TRUE | NULL |
+-------------------------------------------------------------------------------------------------------------------------------------+

1 row available after 23 ms, consumed after another 63 ms
別ターミナルからファイルを見てみる
$ cat /var/lib/neo4j/import/result.csv
"a.NAME","a.ADD"
"田中","東広島"
"山本","北広島"
neo4j@neo4j> match (n) detach delete n;
neo4j@neo4j>:quit
$ sudo neo4j stop // 終了
===========================================
同じ例を neo4jブラウザでやってみる

$ sudo neo4j start
ブラウザ localhost:7474 Username: XXXXX Pssword:XXXXXX

neo4j$ LOAD CSV WITH HEADERS FROM 'file:///sample.csv' AS row
       MERGE (p:Person{ID:coalesce(row.id,"Unknown"), NAME:coalesce(row.name,"Unknown"),ADD:coalesce(row.add,"Unknown"), JOB:coalesce(row.job,"Unknown"), REL:coalesce(row.relation,"Unknown")}); //Ctrl+Enter

neo4j$ MATCH (a:Person) WHERE a.ADD CONTAINS '広島' RETURN a.NAME, a.ADD; //Enter
上のバーから Expor CSV をクリック

出力をターミナルから見てみる
$ cat export.csv
a.NAME,a.ADD
田中,東広島
山本,北広島
$ MATCH (n) DETACH DELETE n; してneo4j 左の赤っぽいアイコンで終了。$ sudo neo4j stop
 
===========================
結局、文字列指定のダブルクォートの差以外は、同じ結果でした。
以上、まるっきり素人の私には、いろいろ覚えなくてもいい方を選ぶ。
 
環境 Debian 10, neo4j 4.2.7 community 版, Cypher-Shell 4.2.7

2021年6月9日水曜日

neo4jの拡張プラグイン apocの設定

動機:
neo4jで検索したリレーションやノードは'TEXT'としてコピペはできるけど、ファイルとして出力したい → 'apoc'という拡張プラグインで csv出力できるらしい。

環境:
Debian 10, neo4j 4.2.7 community 版, Cypher-Shell 4.2.7

設定:
neo4j community インストール済ならば、/var/lib/neo4j/labs/apoc-4.2.0.4-core.jar がすでに入っている。ただし同 README.txt記述の設定と export設定が必要。

(neo4j サーバが動いてない状態で)
1) $ sudo cp /var/lib/neo4j/labs/apoc-4.2.0.4-core.jar /var/lib/neo4j/plugins/
2) /etc/neo4j/neo4j.conf 262行目あたりに追記
  dbms.security.procedures.unrestricted=apoc.*
3) /etc/neo4j/neo4j.conf 最後辺りに追記
  apoc.export.file.enabled=true
  apoc.import.file.enabled=true

chown neo4j:neo4j apoc-4.2.0.4-core.jar
chmod 755 apoc-4.2.0.4-core.jar
の手順記事もあった。やらなくても動いた。

動作確認:
$ sudo neo4j start // neo4jサーバ起動
$ cypher-shell -u neo4j -p XXXX //cypher-shell起動
neo4j@neo4j> return apoc.version();  //⇠neo4jブラウザからでも可
+----------------+
| apoc.version() |
+----------------+
| "4.2.0.4"      |
+----------------+   // 受け付けるっぽい
neo4j@neo4j> merge (a:Person{name:'Yamada', age:tointeger(30), address:'Yamanashi'}); //ノード作成して実験
neo4j@neo4j> call apoc.export.csv.all("out_node.csv", {}); //⇠neo4jブラウザからでも可 out_node.csvに出力
別ターミナルから デフォルト import先の /var/lib/neo4j/import を見てみる。
(neo4j.confで import先を変更してる場合は、そちらに出力される)
$ ls -l /var/lib/neo4j/import/out_node.csv
-rw-r--r-- 1 root root out_node.csv
$ cat out_node.csv
"_id","_labels","address","age","name","_start","_end","_type"
"0",":Person","Yamanashi","30","Yamada",,,       // なんか OKみたい

neo4j@neo4j> match (n) detach delete n; // 以上、クリーニング
neo4j@neo4j> :exit    // cypher-shell終了
$ sudo neo4j stop     // neo4jサーバ停止

まとめ:
CALL apoc.export.csv.all("出力ファイル名.csv", {}); が得られた。
他に apoc.export.csv.query というプロシージャもある。

出力ファイル先 import を /etc/neo4j/neo4j.confのdbms.directories.import=/var/lib/neo4j/import を /home/USER/...などに変更してる場合、出力.csvが rootでしかrwできないのは不便かも...どこで変えるんだろう?
 
本末転倒
apoc設定しなくても、neo4jブラウザの場合、returnで返すようなコードの場合は、右上のバーから csv, json, png, svg でファイルが保存できる。

 


2021年5月29日土曜日

Cypher-shellと neo4j browser

概要
cypher-shellとneo4jブラウザはどういう関係か?試してみる。

手順
a). cypher-shellでノード"のび太"を作る。
b). ブラウザで"のび太"を見てみる。次にブラウザでノード"のび太"を消す。
c). cypher-shellでノードが消えたかどうか確認してみる。

作業
a).
 1 neo4j サーバを起動。ターミナルから、
 $ sudo neo4j start
 ($ systemctl start neo4j ... $ sudo systemctl stop neo4j の起動/終了でも可)

 2 cypher-shellをターミナルからユーザ名とパスワード付きで起動。ノード"のび太"を作る。
 $ cypher-shell -u neo4j -p PASSWORD
 ...
 neo4j@neo4j> merge (a:Person{name:"のび太"});

b).
 3 ブラウザ立ち上げてURLにlocalhost:7474。上記2と同じユーザ名とパスワードを入力してneo4j-browserを起動して、ノード"のび太"を見てみる

 neo4j$ match (a:Person) return a; 

╒══════════════╕ 
│"a"           │
╞══════════════╡
│{"name":"のび太"}│
└──────────────┘


 Textでも Graphでも 表示されている。

 4 次に、ノード"のび太"をneo4jブラウザで削除
 neo4j$ MATCH (a:Person) DELETE a;

c).
 5 cypher-shell側から消えたかどうか確認してみる。
 ターミナルのcypher-shellで
 neo4j@neo4j> match (a:Person) return a;
 +---+
 | a |
 +---+
 +---+
 ちゃんと消えてる。

 6 終了
 ブラウザ側、左サイドバーの[(赤い) Browser Sync]→ Clear local data → Clear local data →最初のユーザ名/パスワード入力画面になったらブラウザを閉じる。
 次に、cypher-shell側。neo4j@neo4j> :exit で終了。忘れずに、$ sudo neo4j stop

------
環境は、
$ lsb_release -d
Description:    Debian GNU/Linux 10 (buster)
 
neo4j community版
$ cypher-shell --version
Cypher-Shell 4.2.7

$ neo4j --version
neo4j 4.2.7
------

2021年4月24日土曜日

neo4jメモ

 OS関係: Debian 10 (buster), KDE, plasmashell, neo4j version 4.2.5 community 版

neo4j ブラウザでの使い方

使用可能なブラウザ

Neo4jにはブラウザが必要。使えるブラウザは Edge, Chrome, Firefox。Chrome系の iron, Firefox系の Waterfox classicでも動いた。

  • 入力の仕方 Enterキー
    入力欄 neo4j$ Enterキーの仕方。

    • 1行パターン
    コード [Enter]
    • 複数行パターン
    コード [Shift+Enter] 続きコード [Enter] ...... [Enter] コード終了 実行 [Ctrl+Enter]

    エラーが出たら、その上に表示される入力ソースを訂正して [Ctrl+Enter]

Hello world! と表示するだけの例

(1個のノードのバリューを表示するだけ)

1. ターミナルで systemctl start neo4j → ルートパスワード または、sudo neo4j start → ユーザパスワード。neo4jはサービスで動いてるのでターミナルは閉じても開きっぱなしでもかまわない。 2. ブラウザを起動。アドレス欄に "http://localhost:7474/" と入力。 3. Usernameと Password (初期値は neo4j, neo4j or 自分の設定ワード)。初めてのときはpasswordを変更しないとログインできない。 4. 入力欄 neo4j$ に CREATE (p:Smile{message:"Hello \n world!"}) /// [Shift+Enter] RETURN p /// [Ctrl+Enter] 5. 終了。左サイドウインドの下の方の赤いアイコン→Clear local data→Clear local data→ログイン画面に戻ったらブラウザを終了。 6. ターミナルで、systemctl stop neo4j → ルートパスワード または sudo neo4j stop → ユーザパスワード

素人の雑感

  • グラフ表示が出なかったら、左の"Graph"アイコンをクリック (OSによって上記 \nは、\r\nかも)。

  • 上の例なら、全部小文字でも構わない。任意に付けたラベル(上のSmile)は、大文字と小文字は別の要素になる。(入力は cypher-shellに渡してるだけ?)

  • createで作ったノードは間違って入力したものもどんどん貯まる。上の例言えば MATCH (p) RETURN p とすれば間違い入力分も表示する。MATCH (p) DELETE p で消せる。MATCH (n) RETURN n ならその他も全て表示。まとめて全部消すには MATCH (n) DETACH DELETE n

  • ブラウザにコードのコピペできないとき
    ネット上のコードサンプルや、テキストで書いたコードをブラウザのコード欄 'neo4j$ 'にマウス右ボタンでコピー、左ボタンでペーストできない場合、 3or5ボタンマウスなら真ん中ボタンでペーストするとうまく行くことがある。

  • ノード(グラフの○、デフォルトで300)が増えると一気に処理が遅くなる (総当り的?)。この手のソフトはマルチコアでもCore 1コしか使わないので、早いクロックのCPUが向いてる。 バージョンアップでマルチコアで処理するようになった。

  • 試しに自治体の Covid19情報から、感染の経路をたどってみた (濃厚接触者不明と2次で経路が途絶えたものを除くノード5600程)。(関連 graphviz)


2021年4月19日月曜日

Debian 10にneo4jをインストール

neo4j バージョン4.2 community 版をインストール。

java 11 が必要なので $ java --version で openjdk 11 を確認。

Community版 Enterprise版の違い
A Closer Look at Neo4j Editions
https://neo4j.com/subscriptions/#editions
 
1) インストール
neo4j docsの‘1.2. Add the repository’ から、

    $ wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - echo 'deb https://debian.neo4j.com stable 4.2' | sudo tee -a /etc/apt/sources.list.d/neo4j.list
    $ sudo apt-get update
    ///
    $ sudo apt install neo4j

    $ neo4j --version
    neo4j 4.2.5                    ⇠インストールされたバージョン
    /// install 完了

2) 設定
基本的な設定は、/etc/neo4/neo4j.conf で行う。
 
「WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j manual.」の対策。
 $ systemctl start neo4j で動かす場合
    /usr/lib/systemd/system/neo4j.service
    [Service]
    LimitNOFILE=60000      ⇠こうなってた

 $ sudo neo4j start で動かす場合
    /etc/systemd/user.conf
    [Manager]
    DefaultLimitNOFILE=60000       ⇠ 変更

3) ディレクト $ sudo neo4j start 時に表示される
 Directories in use:
  home:         /var/lib/neo4j
  config:       /etc/neo4j
  logs:         /var/log/neo4j
  plugins:      /var/lib/neo4j/plugins
  import:       /var/lib/neo4j/import
  data:         /var/lib/neo4j/data
  certificates: /var/lib/neo4j/certificates
  run:          /var/run/neo4j

import先の変更は、/etc/neo4j/neo4j.conf の22行目
dbms.directories.import=/var/lib/neo4j/import を変更してやる。日本語ディレクトリ名は通らない。

上記環境)
Debian GNU/Linux 10 (buster), KDE Plasma 5.14.5, KDE Frameworks 5.54.0, QT 5.11.3


2021年4月5日月曜日

Markdown note

マークダウン.md --- title: Markdown note ---

1. Markdown

単純化したなマークアップ。HTMLの最小機能版。 マークダウンによる基本記述は、Markdown: Syntax:https://daringfireball.net/projects/markdown/syntax 実際は拡張されたmarkdownが多種ある。GitHub Flavored Markdown GFM がメジャーだと言われている。

1.1. マークダウンの表示とエディタ

基本的にはテキストエディタでさえあればマークダウンの記述は可能。拡張子は決まってない。mdの場合がほとんど。原則、html で表示する (RFC7763)。

1.1.1. Debian(debファイル)

debパッケージでインストール可能なエディタ兼プレビュー。

  • ghostwriter : サイドウィンドウに結果表示。
    ホーム https://wereturtle.github.io/ghostwriter/
    Debian buster では ghostwriter v1.7.4、latestは v1.8.1
    Debianで最新にmake してみた。ダウンロード先 source code。v1.7.4→v1.8.1にしたらテーブルの最後の行が閉じるようになった。

    $ sudo apt install g++ qt5-default qtbase5-dev libqt5svg5-dev qtmultimedia5-dev qtwebengine5-dev libhunspell-dev pkg-config libqt5concurrent5 qttools5-dev-tools $ cd <your_ghostwriter_folder_location> $ qmake $ make # make install // デフォルトインストール先 /usr/local/bin/

別途、pandoc, discount, cmarkがインストールされていると、Sundown, Pandoc, Pandoc CommonMark, Pandoc GitHub-flavored Markdown, Pandoc PHP Markdown Extra, Pandoc MultiMarkdown, Pandoc Strict, Discount, cmark 型で各種エクスポートできる。

  • ReText : ソースとプレビュー表示。
    本来の Markdownに近い。Block codeは整形してくれない。

上記2つは、簡単にmarkdownをプレビュー見ながら入力して、html, pdf に出力できる。

  • code : マイクロソフトの汎用テキストエディタ Visual studio code。Debianのパッケージ名は code。

1.1.2. Remarkable

  • REMARLABLE https://remarkableapp.github.io/i かなり拡張されているので、他ではプレビューできないかも。Debian busterにremarkable_1.87_all.deb を入れようとしたら、gir1.2-webkit-3.0にダウングレードの必要があったので諦めた。

1.1.3. Typora

  • flatpakのflathub や snap 上で Typora をインストールする方法がある。

  • T for Linux に binary file Typora-linux-x64.tar.gz がある。

  • 直接 Typora からインストール。

    例 $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE $ sudo add-apt-repository 'deb https://typora.io ./linux/ ' $ sudo apt-get update $ sudo apt-get install typora

1.1.4. Boostnote

  • Boost Noteに debファイルがある。GitHubのアカウントが必要。cloudサービス。有料版と無料版(100M)

1.1.5. Joplin

  • Joplin。クラウドサービス。debはないけどLinux インストール.sh

1.1.6. Atom

  • ATOM に debファイル。

1.1.7. Visual Stuido Code

Microsoftのテキストエディタ(略 VScode)。本家 Visual Studio Code

  • Debian の synapticsや aptでは、codeというパッケージ名をインストール。

  • 起動するには、

    • ファイル.mdを右クリック→アプリケーションで開く→Visual Studio Code
    • スタート→すべてのアプリケーション→ユーティリティー→Text Editor
  • メニューの日本語化

    2通りの方法

    1. メニューバー: View → Command Palette を開いて Configure Display Language で検索 → Install additional languages から Japanese Language Pack for Visual Studio Code をinstall して Restart Now

    2. 左サイドバーの田の字の欠けたアイコンをクリック → japanese で検索 → Japanese Language Pack for Visual Studio Code : install して Restart Now

  • プレビューを開いた状態で起動させる
    マークダウンファイル(md)を開くたびに右上のアイコンでプレビューオープンするのが面倒なら、拡張機能を利用して自動オープンにする。
    メニューバー→表示→拡張機能→ (検索) 'auto-open' : Auto-Open Markdown Preview をインストール

  • TOC table of contents 拡張機能使用時の問題
    VScodeの「EOL end of line 行末」が autoになっていると失敗する。linuxだと $ echo "" | od -c で行末確認できる。使用OSに従って unix系やOSXは \n、Windows系 \r\nにする。左下の歯車マークの設定から検索で'eol'で検索して変更。

  • MarkdownをHTMLで出力
    拡張機能インストールで対応。markdown-pdfや vscode-pandocなど

  • 目次 TOC table of contents
    #〜### H1〜H3で目次を作る。拡張機能 Markdown Toc (章番号の自動化も可能だけど内部参照と辻褄あわなくなったりする)、Markdown Preview Enhanced など。pandocでもTOC作成可能。

1.1.8. 番外

  • Kate : モードの切り替えでプログラミング入力に対応するKDEのテキストエディタ。kpartsplugin と KMarkdownWebViewPart でMarkdownのプレビュー可能なはずだけど現状では無理っぽい。 Katebuildで pandoc等のコマンドを通してmarkdown→htmlは可能 https://azaharblanca.blogspot.com/2021/04/kde-kate-md-html.html。

  • Okular : okular-extra-backends (と kpartsplugin)を入れると、Markdown(.md)が読める (Kateから呼び出せるらしい)ので、HTMLにエクスポートできる。
    参考 https://www.maketecheasier.com/convert-markdown-to-html-in-kate-text-editor/

  • vim エディタを使用してる場合。vim-voomのインストールでmarkdownのアウトラインが表示できる。

1.2. Markdownの HTML出力

1.2.1. markdown, mmark, marked コマンド

  • Debianでは、markdownパッケージをインストールするとターミナルから markdownコマンドで md形式のファイルを html出力できる。

    例 $ markdown sample.md > sample.html

    <body>の中身だけの sample.htmlが出来る。 詳細は man markdown。

    他に mmarkや node-marked (コマンドとしては marked) や pandocなど。

1.2.2. pandoc

  • pandocは、多くのテキストファイル形式を別形式に変換する。markdown→htmlも可能。

    md→htmlの例. -s standalone <head><body>html全体を作成 $ pandoc -s sample.md -o sample.html toc : table of contents 目次作成 $ pandoc -s --toc sample.md -o sample.html GitHub-flavored Markdown(gfm)タイプのhtml出力。 $ pandoc -s -r gfm sample.md -w html -o sample.html

    templateを入れることで、さらに拡張整形ができる。
    例えば https://github.com/jgm/pandoc/wiki/User-contributed-templates > HTML > Easy Pandoc Templates の clean_menu.html を使う場合、 ~/.pandoc/templates/ を作成してここにclean_menu.htmlを置いて、

    # templateの使用例 $ pandoc -s --toc --template=clean_menu.html sample.md -o sample.html

以上
Debian buster, KDE, plasmashell, VScode + Markdown TOC + Markdown PDF で試した個人的なメモ