[心得] Perl的Neo4j NoSQL函式库使用范例与笔记

楼主: Esh   2014-01-26 22:05:12
完整图文版
http://blog.leezhenyu.com/2014/01/neo4j-perl-and-cgi.html
*******
这周末尝试做一些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就是这么简单。
附上官方的参考资料
作者: abliou (愚者)   2014-01-26 23:12:00
笔记先推再说!!
作者: xatier (一切重来就好了...)   2014-02-01 20:43:00
作者: flu (Crazy Rhythm)   2014-02-02 02:50:00
+1
作者: wangmj   2014-02-15 12:01:00
Perl 写网页可以参考 Mojolicious or Dancer

Links booklink

Contact Us: admin [ a t ] ucptt.com