2014年1月26日 星期日

Neo4j: Perl與CGI範例

How to using Neo4j perl library?
From local script to Web CGI.
I've create a simple backend case.

*******

這週末嘗試做一些Neo4j的網頁介面整合。
因為資料庫最終還是需要有前端的查詢介面。
測試了很多的Neo4j函式庫,最後還是選擇Perl。
Python的Django我不會,現在也沒空學。
Ruby的部份,我已經忘了RoR(Ruby on Rails)。
用Perl配合CGI的作法還是容易許多。

首先要做的,是安裝Neo4j的Perl函式庫。
用CPAN安裝就好,進入CPAN的指令介面後:
install REST::Neo4p
就會開始安裝所有必要套件,編譯並且測試。

















另外,Apache2網頁伺服器也要開啟CGI的支援,
主要是修改設定檔,指定CGI程式的目錄。
以Ubuntu為例,要修改的是/etc/apache2/sites-available/default
加上cgi執行目錄的定義與允許的副檔名
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory /var/www/cgi-bin/>
   Options ExecCGI
   AddHandler cgi-script cgi pl

</Directory>














以上面範例,要建一個cgi-bin的資料夾在/var/www目錄下
(這是Ubuntu預設的網頁根目錄)
之後記得要重開Apache2伺服器
指令是sudo /etc/init.d/apache2 restart






安裝並設定好了以後,先用簡單的Perl程式來測試一下。
主要是驗證資料庫的連接沒有問題。
我先在資料庫主機端測試,避免一些意外狀況。
就建立一個Perl的檔案,然後包含以下的程式碼內容:


#!/usr/bin/perl -w

#呼叫必要的函式庫,特別是Neo4p
use REST::Neo4p;
use strict;
use warnings;

#建立一個與資料庫伺服器的連線
REST::Neo4p->connect('http://127.0.0.1:7474');

#建立一個查詢的物件
my $query = REST::Neo4p::Query->new(
  ' match(peptide)-[:HOST_IN]->({name:"Bos taurus"})
   return peptide' 
#把Cypher語法寫在括弧裡面

);

#送出查詢
$query->execute;

print "Show me which peptide host in \"Bos taurus\"?\n";
while (my $result = $query->fetch)
{
#查詢的結果被回傳,開始Parse結果的JSON檔案
print $result->[0]->get_property('name')."\n";

}


不意外,經過Perl跟Neo4j管理介面回傳的結果都一致






但是我還想知道上面那個案例的回傳矩陣是怎麼運作。
經過了解之後,寫了一個稍微複雜的查詢追蹤程式邏輯

#!/usr/bin/perl -w
use REST::Neo4p;
use strict;
use warnings;

REST::Neo4p->connect('http://127.0.0.1:7474');

print "The sequence of Chrombacin?\n";

#特別要看的部份是以下
my $query2 = REST::Neo4p::Query->new(
'match (peptide {name:"Chrombacin"})-[:HAS_SEQUENCE]->(sequence)
return peptide,sequence'
);

#尤其是這裡
$query2->execute;
while (my $result2 = $query2->fetch) {
   print $result2->[0]->get_property('name')."\n";
   print $result2->[1]->get_property('seq')."\n";

}

現在要回傳的有兩個值(查詢結果):peptide跟sequence
$result2基本上是一個被parse過的陣列集合
$query2是經由Web Service回傳的JSON檔案
所以陣列集合裡按照順序,peptide就是[0],sequence是[1]

至於Properties的部份,對應的name跟seq。
是Node的屬性設定,這在建立節點時就已經定義了。

執行看看這個perl script,結果符合預期。










現在要把Perl用CGI的方式執行,看看能不能成功用網頁展示結果。
把同樣perl script複製到/var/www/cgi-bin裡面。
開啟瀏覽器看看結果,竟然出現錯誤了。











查看其他可以運作的Perl CGI範例。
發現我少了網頁伺服器可以剖析的元件。
Perl的輸出要符合HTML跟瀏覽器的規範啊!
主要是MIME的定義。
所以一開始要先輸出這一行:
print "Content-type: text/html\n"; 


然後其他要用HTML顯示的元素也要符合語法。
例如說換行的部份,就要輸出<br>的標籤。
單單是"\n"並沒有用,只有Perl知道。
HTML的換行是<br/>才對

小改一下perl script內容,存檔之後重開就有了。
也請記得這個pl檔案要賦予執行的權限。
sudo chmod +x case.pl






*******

以上,Perl跟Neo4j就是這麼簡單。
附上官方的參考資料


您也許同樣感興趣的文章:
Neo4j: Cypher語法筆記:Match語法
Neo4j: Cypher語法筆記:Pattern呈現形式
Neo4j: Cypher語法筆記:Expressions

沒有留言: