2KB项目,专业的源码交易网站 帮助 收藏 每日签到

在 Python 中应用 Neo4j

  • 时间:2019-06-01 21:18 编辑:2KB 来源:2KB.COM 阅读:500
  • 扫一扫,手机访问
  • 分享
摘要:
Neo4j Python 英文原文:Using Neo4j from Python

一个访客在Nigel Small公布的文章,他感兴味的范围包括Python、Javascript、PostgreSQL、Neo4j和Linux。他是一些开源项目的创始者,其中最有名的是py2neo,他是一个生动的博客、演说者及Neo4j社区成员。可以颠末@technige找到他。

Neo4j是面向Tools基于Java的 ,被设计为一个建立在Java之上、可以间接嵌入运用的数据存储。此后,其他言语和平台的支持被引入,Neo4j社区获得继续增加,获得了越来越多的技能支持者。目前已支持.NETRubyPythonNode.jsPHP等。因此,不管是什么项目,没有因由不引入Neo4j。

本文重点引见Python,这门言语的哲学与Java大大不合,同时展示py2neo库怎样被用来建立一个轻易的运用次序。

一个快速的REST例子

首先来看些基本知识。假设没有处事API,Neo4j就不能支持其他言语。该接供词给一组基于JSON消息格式的RESTful Web处事和一个全面的创造机制。应用中应用这个接口的最快和最随便的方法是颠末应用cURL

$ curl http://localhost:7474/db/data/
{ 
  "extensions" : { 
  }, 
  "node" : "http://localhost:7474/db/data/node", 
  "node_index" : "http://localhost:7474/db/data/index/node", 
  "relationship_index" : "http://localhost:7474/db/data/index/relationship", 
  "extensions_info" : "http://localhost:7474/db/data/ext", 
  "relationship_types" : "http://localhost:7474/db/data/relationship/types", 
  "batch" : "http://localhost:7474/db/data/batch", 
  "cypher" : "http://localhost:7474/db/data/cypher", 
  "transaction" : "http://localhost:7474/db/data/transaction", 
  "neo4j_version" : "2.0.0-M03" 
}

从这个端点前去JSONTools包含一组本钱称呼和URI下可以找到的Cypher端点。在消息载荷中接受传送来的Cyper央求并实行这些查询,在HTTP照应中前去结果。

正是这类REST API接口,使得现在已有的各种Neo4j驱动得以建立。py2neo供应了这些REST本钱的轻易封装,这使Python运用次序开拓者可以担忧应用Neo4j而不用思考底层的客户机-Server协议。

一个轻易的运用

为理论验证py2neo,我们将着眼于建立一个轻易的用于存储姓名和电子邮件地址的通讯录管理系统。我们自然会应用节点来模拟每一个自力实体,但它是要记取,Neo4j没有类型的观念。类型是从周围的关系和属性推断来的。

下面的关系图中人显示为白色、电子邮件地址节点显示为蓝色。这些当然是隧道的逻辑演示节点,但数据本身并没有差异。

neo4j

我们的运用次序将完成两个功用:添加新的联系人信息和检索联系人的残缺列表。为此,我们将创建一个Person类包装Py2neoNodeobject,这使我们有一个底层处理的完成且留出用户级的功用。上图中的ROOT节点是指上图中一个结实的参考点,我们沿着这个点末尾。

让我们间接看看代码。下面是一个残缺的小型运用。这个次序容许添加新的名字与一个也许更多email地址相连接的和供应了一个随便的办法来显示这些连接信息的一个号召行Tools。没有参数的运转是显示应用方式,而且这个唯一的依托只是需求一个外地未修改的Neo4j实例(instance)而已。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from __future__ import print_function 

import sys 
from py2neo import neo4j, node, rel 

graph_db = neo4j.GraphDatabaseService() 

class Person(object): 
    
    _root = graph_db.get_or_create_indexed_node("reference", 
         "contacts", "root") 
    
    @classmethod 
    def create(cls, name, *emails): 
        person_node, _ = graph_db.create(node(name=name), 
              rel(cls._root, "PERSON", 0)) 
        for email in emails: 
            graph_db.create(node(email=email), rel(cls._root, "EMAIL", 0),
                  rel(person_node, "EMAIL", 0)) 
        return Person(person_node) 
    
    @classmethod 
    def get_all(cls): 
        return [Person(person.end_node) for person in 
              cls._root.match("PERSON")] 
    
    def __init__(self, node): 
        self._node = node 
    
    def __str__(self): 
        return self.name + "
" + "
".join("  <{0}>"
             .format(email) for email in self.emails) 
    
    @property 
    def name(self): 
        return self._node["name"] 
    
    @property 
    def emails(self): 
        return [rel.end_node["email"] for rel in 
             self._node.match("EMAIL")] 

if __name__ == "__main__": 
    if len(sys.argv) < 2: 
        app = sys.argv[0] 
        print("Usage: {0} add <name> <email>
              [<email>...]".format(app)) 
        print("       {0} list".format(app)) 
        sys.exit() 
    method = sys.argv[1] 
    if method == "add": 
        print(Person.create(*sys.argv[2:])) 
    elif method == "list": 
        for person in Person.get_all(): 
            print(person) 
    else: 
print("Unknown command")
在第09行上是第一行Py2neo代码,用来创建了一个 GraphDatabaseServiceTools。颠末这个,我们就可以够访问应用Neo4j server的大大大多数功用。可选一个URI传递到这个构造器里,固然假设什么都没有供应,代而取之的是应用默许确当地参数。也就是说下面两行是完好相等的:
graph_db = neo4j.GraphDatabaseService()
graph_db = neo4j.GraphDatabaseService
("http://localhost:7474/db/data/")

第13行引见了调用了get_or_create_indexed_node,它供应一种在图形里创建结实引用点的漂亮办法。传统的Neo4j索引容许节点和关系颠末键值对访问,而在这个代码里我们应用了带连接的关键字和root值的引用索引实例。在第一次实行时,会创建一个新的节点,而且在随后的实行中,这个节点(即root)会复用(reused)。

在第17行,我们看见了举荐的节点和关系笼统的标记,和接受和应用节点和关系笼统的 create方法。尽情多的笼统都可以被传递到这个方法中,并且在单个批处理转换中创建实体并以指定它们的次第作为一个列表前去。笼统节点用 节点函数表示并带有一些属性,可是笼统关系应用 rel函数接受一个肇端节点,类型和终止节点。上下文中,其他节点,关系肇端和终止节点可能整合引用到在其他批处理中其他节点。在我们的例子中,我们把根节点连接到新创建的person节点,否则就作为项目0(item 0)了。

此次我们在第24行和38行上以match方法方法和关系会见[@Lesus 注: oschina代码行数有问题。对应于本文的第28和44行]。它试图应用一个特殊的条件凑集(set)标识关系,然后应用列表(list)前去它们。这这些示例中,这个关系和PERSON关系相适配,从root节点和EMAIL关系末尾到所给定的person节点。和Cypher很相似,用来查询包含MATCH关键字的场景。

最后值得留心的一点是在上面的代码中访问节点属性的办法只是其中一种轻易的办法。Py2neo重写了标准python的__getitem__和 __setitem__方法,颠末方括号标识来便当访问任何属性。这点在第34和38行上可以看到。[@Lesus 注:对应于本文的第39和44行]

总结

在何处(代码行34和38)我们多么做了,这显示了它是怎样快速简单纯真地在JAVA状况之外凑合出一个Neo4j运用次序,也显示了Py2neo是怎样颠末REST API来笼统出大大大多数沉重的担当。这里的例子并没有处置唯一性,固然功用上供应了唯一索引和Cypher CREATE UNIQUE语句。Django开拓者可能也想要思考一个层,如Neomodel,它在Py2neo顶层上表示了一个Djangoesque ORM-style 层。

本文中的一切译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译Task依照 CC 协议,假设我们的Task有侵犯到您的权益,请及时联系我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部