Neo4j 在您自己的软件中:非常基础的 Perl 黑客技术

在本三部分系列的最后一篇文章中,学习编写一些 Perl 代码来查询您的图数据库。
515 位读者喜欢这篇文章。
An introduction to GNU Screen

Opensource.com

在本系列的前几篇文章中,我们了解了图数据库的基础知识,并安装并开始使用了 Neo4j,这是一款流行的开源图数据库。在本文的最后一部分中,我们将编写一些 Perl 代码来执行与我们在第二篇文章中所做的相同操作,并向您介绍一些其他库,以便在您自己的编程中使用 Neo4j。

如果您仍然保留了前一篇文章中的数据库,请务必使用此 Cypher 查询擦除其中的所有数据

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r

现在您有了一个空图,就可以开始使用 Perl 了。我编写了一个脚本,它将重新创建该图。鉴于您在前几篇文章中已经了解了关于 Neo4j 的知识,这应该非常简单明了。我在我的 Debian stretch 盒子上使用 Perl 5.24,并使用了 Mark Jensen 出色的 CPAN 模块 REST::Neo4p。Neo4j 安装在同一台机器上,因此它是本地连接。

#!/usr/bin/perl

use strict;
use warnings;
use REST::Neo4p;

# Connect to the database. Anonymous connections are not allowed, so give a username and password.

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

# Create the nodes and set labels on them. I'll use the same variables as
# before, but they won't go out of scope so quickly!

my $a = REST::Neo4p::Node->new(
    {
        name           => 'Jane Doe',
        favorite_color => 'purple'
    }
)->set_labels('Person');
my $b = REST::Neo4p::Node->new( { name => 'John Doe' } )->set_labels('Person');
my $c = REST::Neo4p::Node->new(
    {
        name           => 'Mary Smith',
        favorite_color => 'red',
        dob            => '1992-11-09'
    }
)->set_labels('Person');
my $d =
  REST::Neo4p::Node->new( { name => 'Robert Roe' } )->set_labels('Person');
my $e =
  REST::Neo4p::Node->new( { name => 'Rhonda Roe' } )->set_labels('Person');
my $f = REST::Neo4p::Node->new( { name => 'Ryan Roe' } )->set_labels('Person');
my $t =
  REST::Neo4p::Node->new( { name => 'Petaluma, CA' } )->set_labels('City');
my $u = REST::Neo4p::Node->new( { name => 'Cypress, TX' } )->set_labels('City');
my $v =
  REST::Neo4p::Node->new( { name => 'Grand Prairie, TX' } )->set_labels('City');
my $w = REST::Neo4p::Node->new( { name => 'Houston, TX' } )->set_labels('City');

# Big difference here; we don't have to search out our nodes; we have them
# in scope already. While we're messing with our in-scope copy, Neo4J is
# updating the storage to match!

$a->relate_to( $b, 'MARRIAGE',
    { date => '2017-03-04', place => 'Houston, TX' } );
$d->relate_to( $e, 'MARRIAGE',
    { date => '1990-12-01', place => 'Chicago, IL' } );
$a->relate_to( $c, 'CHILD' );
$d->relate_to( $f, 'CHILD' );
$e->relate_to( $f, 'CHILD' );
$b->relate_to( $c, 'STEPCHILD' );
$a->relate_to( $v, 'BORN_IN' );
$b->relate_to( $t, 'BORN_IN' );
$c->relate_to( $f, 'DATING' );
$a->relate_to( $u, 'LIVES_IN' );
$b->relate_to( $u, 'LIVES_IN' );
$a->relate_to( $w, 'WORKS_IN' );
$a->relate_to( $d, 'FRIEND' );
$a->relate_to( $e, 'FRIEND' );

此时,如果您运行了该脚本,您可以转到您的 Neo4j 浏览器并运行此查询

MATCH (n)
RETURN n

...并看到与您在前一篇文章中看到的相同的图。让我们检查一些用于查询该图的代码片段。所有这些都假设您已经连接到数据库。

my $query = REST::Neo4p::Query->new('MATCH (n)
                                     RETURN n');
$query->execute;
while (my $result = $query->fetch) {
    my $labels = join ( ',', $result->[0]->get_labels );
    my $name = $result->[0]->get_property('name');
    print "Labels: $labels --- Name: $name\n";
}

通过此查询,我们获得了所有节点的列表。但是关系在哪里呢?在浏览器中,如果关系附加到图中存在的两个节点,则数据库会自动将关系添加到显示中。在 Perl 中,情况并非如此,您需要专门探索这些关系对象

my $query = REST::Neo4p::Query->new('MATCH (a:Person)-[:MARRIAGE]->(b:Person)
                                     RETURN a,b');
$query->execute;
while (my $result = $query->fetch) {
    my $name_a = $result->[0]->get_property('name');
    my $name_b = $result->[1]->get_property('name');
    print "$name_a is married to $name_b\n";
}

这给了我们图中所有的已婚夫妇

Jane Doe is married to John Doe
Robert Roe is married to Rhonda Roe

这与在浏览器界面中工作稍微有点不同,但是您可以在 Perl 中完成在浏览器中可以完成的任何操作。

还记得在第一篇文章中,我说过如果您不希望关系的方向很重要,那么它就不必重要吗?让我们在此查询中更改件事,看看会发生什么。如果我们将上面查询中的箭头更改为破折号,那么我们会得到

John Doe is married to Jane Doe
Jane Doe is married to John Doe
Rhonda Roe is married to Robert Roe
Robert Roe is married to Rhonda Roe

关系被定义为有向的,因为在 Neo4j 中没有其他方法可以做到这一点。但是在我们的查询中,我们不必担心这一点,它仍然给了我们相反的结果。这种行为可能对您有用,也可能没用,但是当您开始编写查询时,这绝对是需要注意的事情!

在本系列中,我们实际上只是触及了 Neo4j 和图数据库的非常基础的开端。如果 Perl 不是您选择的语言,那么由于围绕 Neo4j 蓬勃发展的开发者社区,已经有许多流行的开发语言的驱动程序可用。您可以在 Neo4j 网站上找到有关这些驱动程序的更多信息。此外,Neo4j 开箱即用地配备了 REST 接口,因此任何可以使用 REST 的应用程序都可以使用它来获取描述任何 Cypher 查询结果的 JSON 结果。

图数据库为地球上一些最大的信息池提供支持,包括 Facebook、Twitter 等。快速了解基础知识让您有机会涉足其中,并希望能够让您思考图如何帮助您的下一个大数据项目!

标签
User profile image.
Ruth Holloway 长期以来一直担任系统管理员和软件开发人员,早在 VAX 11/780 上就开始了她的职业生涯。她职业生涯的大部分时间(到目前为止)都在为图书馆的技术需求服务,自 2008 年以来一直是 Koha 开源图书馆自动化套件的贡献者。Ruth 目前是 Clearbuilt 的 Perl 开发人员和项目负责人。

评论已关闭。

© . All rights reserved.