我现在正在尝试学习如何连接到Neo4j服务器并使用来自Python的Bulbflow在其上运行Cypher查询。我不明白的是,连接到neo4j服务器的两种可能性之间的区别:

1)Graph

from bulbs.neo4jserver import Graph
g = Graph()

2)Neo4jClient
from bulbs.neo4jserver import Neo4jClient
client = Neo4jClient()

有人可以在这里解释概念上的区别吗?
那么,如果我接下来要对服务器执行(很多)Cypher查询并最终并行执行,哪种方法更好呢?

PS:我没有足够的声誉来创建这个问题的标签“bulbflow” :)

最佳答案

Bulbs支持三种不同的图形数据库服务器-Neo4j ServerRexster和现在的Titan

每个后端服务器特有的代码都包含在其自己的Python包(目录)中。您应该看到以下目录:neo4jserver,rexster,titan:

  • Bulbs源代码:https://github.com/espeed/bulbs/tree/master/bulbs
  • Neo4jClient是Neo4j Server的低级适配器-除非您要进行自定义操作,否则通常不需要直接使用它-而是使用高级Graph类。

    请参阅灯泡文档以获取...
  • Neo4j服务器客户端:http://bulbflow.com/docs/api/bulbs/neo4jserver/client/
  • Neo4j服务器图:http://bulbflow.com/docs/api/bulbs/neo4jserver/graph/

  • “灯泡快速入门”指南提供了有关使用Graph接口(interface)的示例:
  • 灯泡快速入门:http://bulbflow.com/quickstart/

  • 但是,当您需要通过_client var访问时,您的Bulbs对象始终可以访问低级客户端。

    我创建了一个示例应用程序Lightbulb,以展示如何使用和自定义Bulbs模型-这是一个Python博客引擎,使用Git进行源代码控制,使用图数据库进行持久化。
  • 灯泡:https://github.com/espeed/lightbulb

  • Lightbulb最初设计为与免费Neo4j Heroku Add On一起使用,但是Bulbs和Lightbulb都大量使用Gremlin,而Neo4j Heroko Add On不再提供免费版Gremlin。

    Lightbulb模型文件包含一个高度自定义的Entry模型和一个自定义Graph类-Entry模型利用了低级客户端:
  • 灯泡型号:https://github.com/espeed/lightbulb/blob/master/lightbulb/model.py

  • 正如您在Entry模型中看到的那样,我可以通过_client var访问低级客户端,然后使用它从scripts库中获取Gremlin脚本,然后再次执行Gremlin脚本。

    这是Entry模型使用的save_blog_entry Gremlin脚本的代码:
  • 灯泡Gremlin脚本:https://github.com/espeed/lightbulb/blob/master/lightbulb/gremlin.groovy



  • 除非进行定制模型之类的操作,否则通常将使用scripts对象和gremlin对象上存储的graph对象:
    >>> from bulbs.neo4jserver import Graph
    >>> g = Graph()
    >>> script = g.scripts.get('some_script')
    >>> params = dict(name="James", city="Dallas")
    >>> g.gremlin.execute(script, params)
    

    参见灯泡Neo4j Gremlin文档...
  • Neo4j Gremlin:http://bulbflow.com/docs/api/bulbs/neo4jserver/gremlin/

  • 同样,当您要执行Neo4j Cypher查询时,请使用存储在cypher对象上的graph对象。

    共有三种Cypher方法(不幸的是,这些方法尚未在网站上记录):
  • g.cypher.query():返回节点/关系列表时使用-它将把它们初始化为对象。
  • g.cypher.table():返回Cypher表数据时使用。
  • g.cypher.exectue():返回任意数据时使用-返回通用的Response对象。

  • 您可以查看源代码以了解它们如何工作...
  • Cypher来源:https://github.com/espeed/bulbs/blob/master/bulbs/neo4jserver/cypher.py

  • 以下是一些使用Cypher query()方法的示例(查询仅返回一个关系):
    >>> from bulbs.neo4jserver import Graph
    >>> g = Graph()
    >>> query = "start a = relationship({eid}) return a"
    >>> params = dict(eid=123)
    >>> edges = g.cypher.query(query, params)
    

    查询方法自动将元素初始化为其类型。如果您将元素创建为自定义模型,则Bulbs会尝试将其初始化为特定类型,否则它将默认为通用VertexEdge

    注意,Bulbs Cypher query()方法返回一个迭代器。

    您可以遍历迭代器...
    >>> from bulbs.neo4jserver import Graph
    >>> g = Graph()
    >>> query = "start a = relationship({eid}) return a"
    >>> params = dict(eid=123)
    >>> edges = g.cypher.query(query, params)
    >>> for edge in edges: print edge
    

    ...或将其转换为列表...
    >>> from bulbs.neo4jserver import Graph
    >>> g = Graph()
    >>> query = "start a = relationship({eid}) return a"
    >>> params = dict(eid=123)
    >>> edges = g.cypher.query(query, params)
    >>> list(edges)
    

    ...或获得下一个项目...
    >>> from bulbs.neo4jserver import Graph
    >>> g = Graph()
    >>> query = "start a = relationship({eid}) return a"
    >>> params = dict(eid=123)
    >>> edges = g.cypher.query(query, params)
    >>> edges.next()
    

    如果您还有其他问题,请告诉我。

    关于python - Bulbflow : difference between neo4jserver Graph and neo4jserver Neo4jclient,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14281251/

    10-13 09:05