LoginSignup
0
0

More than 1 year has passed since last update.

PythonとRとVBAでCyREST API

Posted at

Cytoscapeを自動化するためのCyREST API。
PythonとRとVBAの3種類で使う必要があったのでメモしときます。

環境

Windows7(32bit)
Cytoscape 3.6.1
Python 3.8.3
 モジュールrequestsとjsonをインストールしておきます。
R 3.5.2
 パッケージhttrとjsonliteをインストールしておきます。
VBA Access 2010
 Jsonを使うため、こちらからJsonConverter.basを拾ってきて、プロシージャに追加しておきます。
 文字コードはUTF8を使うので、こちらのUTF8変換用コードもプロシージャのどこかにコピペします。
 参照設定で"Microsoft Scripting Runtime"と"Microsoft XML v6.0"を有効にしておきます。

CyREST APIのマニュアル

Cytoscapeを立ち上げてメニューの
  HELP > Automation > CyREST API または CyREST command API
でマニュアルを参照できます。

CyREST APIの動作確認

Cytoscapeが立ち上がっている状態でWebブラウザを開き、アドレス

Webブラウザ
http://localhost:1234/v1

を開いて

{"allAppsStarted":true,"apiVersion":"v1","numberOfCores":X,"memoryStatus":{"usedMemory":XXX,"freeMemory":XXXX,"totalMemory":XXXX,"maxMemory":XXXXX}}

のように表示されたら、CyREST APIが正常に起動していることが確認できます。

 以下は、Cytoscapeに何かネットワークが表示されているものとして説明します。

Cytoscapeで開いている全てのネットワークIDを取得する

 まずは、CyRESTを使ってCytoscapeから情報を取得する一番簡単な方法を試します。
 マニュアル HELP > Automation > CyREST API > Networks > GET:/v1/networks
 URLリクエスト GET http://localhost:1234/v1/networks
 戻り値は[ID,ID]の文字列です。これはWebブラウザでも確認できます。

1.Webブラウザ

Webブラウザ
http://localhost:1234/v1/networks

2.Python

Python
import json
import requests as req
HD = {'Content-Type':'application/json'}
ret = req.get('http://localhost:1234/v1/networks',headers=HD)
print(ret.json())

3.R

R
require(httr)
require(jsonlite)
ret = GET('http://localhost:1234/v1/networks',encode="json")
content(ret)

4.VBA

VBA
Dim res As Object
Dim httpReq As New XMLHTTP60
Dim ret As String
With httpReq
  .Open "GET", "http://localhost:1234/v1/networks"
  .SetRequestHeader "Content-Type","application/json;charset=UTF-8"
  .send
  ret = FromUTF8(httpReq.responseBody)
  Debug.print("netID : " & ret)
End With

現在表示しているネットワークのIDを取得する

 次は、CytoscapeからJson形式の情報を取得する方法を試してみます。
 マニュアルHELP > Automation > CyREST API > Networks > GET:/v1/networks/currentNetwork
 URLリクエストGET http://localhost:1234/v1/networks/currentNetwork
 戻り値はJson形式です。これもWebブラウザで確認できます。

1.Webブラウザ

Webブラウザ
http://localhost:1234/v1/networks/currentNetwork

2.Python

Python
import json
import requests as req
HD = {'Content-Type':'application/json'}
ret = req.get('http://localhost:1234/v1/networks/currentNetwork',headers=HD)
print(ret.json()['data']['networkSUID'])

3.R

R
require(httr)
require(jsonlite)
ret = GET('http://localhost:1234/v1/networks/currentNetwork',encode="json")
content(ret)$data

4.VBA

VBA
Dim res As Object
Dim httpReq As New XMLHTTP60
Dim retDic As Dictionary
Dim ret As String
With httpReq
  .Open "GET", "http://localhost:1234/v1/networks/currentNetwork"
  .SetRequestHeader "Content-Type","application/json;charset=UTF-8"
  .send
  set retDic = JsonConverter.ParseJson(FromUTF8(httpReq.responseBody))
  ret = retDic("data")("networkSUID")
  Debug.print("netID : " & ret)
End With

ノードのIDとnameを取得する

 最後に、CyRESTにパラメータを渡してそれに対応する戻り値を取得する方法を試してみます。
 マニュアルHELP > Automation > CyREST Command API > node > POST:/v1/commands/node/get attribute
 URLリクエストPOST http://localhost:1234/v1/networks/currentNetwork
 Json形式のパラメータを渡して、戻り値もJson形式です。

1.Python

Python
import json
import requests as req
HD = {'Content-Type':'application/json'}
ret = req.post('http://localhost:1234/v1/commands/node/get attribute',
          json.dumps(
               {'columnList': 'SUID,name','network': 'current'}),
          headers=HD)
retDic = ret.json()['data']
print(retDic)

2.R

R
require(httr)
require(jsonlite)
paraList <- list()
paraList <- c(paraList,list(columnList='SUID,name'))
paraList <- c(paraList,list(network='current'))
ret = POST('http://localhost:1234/v1/commands/node/get%20attribute',
            body=paraList,
            encode="json")
ret <- content(ret)$data
print(ret)

3.VBA

VBA
Dim res As Object
Dim httpReq As New XMLHTTP60
Dim retDic As Dictionary
Dim nodeName() As String
Dim nodeID() As String
Dim param As New Dictionary
Dim bodyStr As String
Dim nCnt As Integer
With httpReq
  param.Add "network","current"
  param.Add "columnList","SUID,name"
  bodyStr = ConvertToJson(param)
  .Open "POST", "http://localhost:1234/v1/commands/node/get%20attribute"
  .SetRequestHeader "Content-Type","application/json;charset=UTF-8"
  .send(bodyStr)
  set retDic = JsonConverter.ParseJson(FromUTF8(httpReq.responseBody))
  ReDim nodeID(retDic("data").Count)
  ReDim nodeName(retDic("data").Count)
  nCnt = 0
  For Each retVal In retDic("data")
    nCnt = nCnt + 1
    nodeID(nCnt) = retVal("SUID")
    nodeName(nCnt) = retVal("name")
  Next retVal
End With

コマンドの調べ方

 マニュアルHELP > Automation > CyREST API または CyREST command APIは、単なるマニュアルではなく、その中でコマンドを試すことができるようになっています。
 例えば、Cytoscapeで開いている全てのネットワークIDを取得するのマニュアルHELP > Automation > CyREST API > Networks > GET:/v1/networksを開いてみます。
image.png
 Response Class に[integer]とあるので、戻り値は[Integer]だろうと予想します。
 左下に「Try it out!」のボタンがあります。これをクリックしてみると、Response Body欄に実行結果が
image.png
 こんな感じで「今開いているネットワークはID61の1枚だよ」と表示されます。
 ここでは、URLリクエストを示すCurl欄と戻り値を示すResponse Body欄をよくよく確認します。
 Curl欄を参考にして実行するURLリクエストを作り、Response Body欄の値を参考にして戻り値の扱いを考え、RとかPythonとかVBAのコードに落とし込むのです。

 現在表示しているネットワークのIDを取得するではどうでしょうか。マニュアルHELP > Automation > CyREST API > Networks > GET:/v1/networks/currentNetworkを開いてみます。
image.png
 Response Class に{data (NetworkSUIDModel, optional),.....}とあるので、戻り値は多分jsonでしょう。
 やっぱり左下に「Try it out!」のボタンがあるので、これをクリックしてみます。
image.png
 Response Body欄にJSON形式で「今開いているネットワークのIDは61だよ」ということが表示されています。戻り値はJSONデータなので、VBAではJSONデータをパースしてDATAを取り出してうんぬんする処理が必要になります。

 最後に、ノードのIDとnameを取得するはどうでしょうか。
 マニュアルのHELP > Automation > CyREST Command API > node > POST:/v1/commands/node/get attributeを開いてみます。
image.png
 Parametersには、bodyの入力枠と、その横に長々と英語で何やら説明文が表示されています。
 ParametersのData Type の下の「Example Value」をクリックしてみると
image.png
と、パラメータの入力例が表示されます。この入力例をクリックすると、Valueの下のbody欄に入力例のデータがそのままペーストされます。その状態で「Try it out!」すると
image.png
 あれ?うまく結果を取得できません。そこで、Parameter Valueを見直して
image.png
 こんな感じにしてもう一度「Try it out!」すると、ちゃんと結果が返ってきました。
 あとは、Parameter Valueを色々いじって必要な項目を取得できるようにして、それをRとかPythonとかのコードに落とし込みます。(POSTとかGETとかを間違えないように注意)
 ちなみに、Parameter Valueに設定できるnode attributeはHELP > Automation > CyREST Command API > node > POST:/v1/commands/node/list attributesで確認できます。

 CyREST APIにはこれ以外にも、
・ネットワークのStyleを変更するGET: /v1/apply/styles/{styleName}/{networkId}
・ノードのnameを変更するPOST: /v1/commands/node/rename
など、魅力的なコマンドが満載です。
 コマンドの使い方は大体同じで、やりたいことができそうなコマンドを探して、マニュアルを開いて、パラメータを変えたりしながら「Try it out!」をして、うまくいったらコードに落とし込んでいく、みたいな感じです。
 とりあえずはマニュアルをあちこち開いて、片っ端から「Try it out!」してみると、どんどん楽しくなってきますよ。

おまけ

 macのRStudioで日本語が文字化けするようでしたらこちらのとおり、ターミナルで

defaults write org.R-project.R force.LANG ja_JP.UTF-8

と呪文を唱えた後RStudioを再起動してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0