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;
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;
#特別要看的部份是以下
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
沒有留言:
張貼留言