neo4j :rel_您自己的软件中的Neo4j:非常基本的Perl黑客

neo4j :rel

在本系列的前几篇文章中,我们研究了图形数据库基础知识,安装并开始使用Neo4j (一种流行的开源图形数据库)。 在最后一篇文章中,我们将编写一些Perl代码来完成与第二​​篇文章中相同的操作,并为您提供一些其他的库,以便在您自己的编程中使用Neo4j。

如果您仍然有上一篇文章中的数据库,请确保并使用此Cypher查询擦除其中的所有数据:

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

现在您有了一个空图,您就可以开始使用Perl了。 我写了一个脚本,将重新创建图形。 鉴于您已经在之前的文章中了解了Neo4j,这应该非常简单。 我在我的Debian拉伸盒上使用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等。 快速浏览基础知识可以使您有机会将脚趾浸入水中,并希望让您考虑图表如何帮助您的下一个大数据项目!

翻译自: https://opensource.com/article/17/7/neo4j-your-own-software-very-basic-perl-hacking

neo4j :rel

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值