6

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

1)图表

from bulbs.neo4jserver import Graph
g = Graph()

2) Neo4jClient

from bulbs.neo4jserver import Neo4jClient
client = Neo4jClient()

谁能在这里解释概念上的差异?如果我想对服务器执行(相当多)Cypher 查询并最终并行执行,那么选择哪种方式更好?

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

4

1 回答 1

13

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

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

Neo4jClient是 Neo4j Server 的低级适配器——通常不需要直接使用它,除非你在做自定义的东西——改用高级 Graph 类。

请参阅灯泡文档以了解...

Bulbs 快速入门指南提供了有关使用该Graph界面的示例:

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

Lightbulb 是我创建的一个示例应用程序,用于展示如何使用和自定义 Bulbs 模型——它是一个 Python 博客引擎,使用 Git 进行源代码控制,使用图形数据库进行持久性。

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

灯泡模型文件包含一个高度定制的Entry模型和一个定制Graph类——该Entry模型利用了低级客户端:

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

下面是save_blog_entryEntry 模型使用的 Gremlin 脚本的代码:

注意:文件中只有一个 Gremlin 脚本,但它很大,包含多个操作,并且所有内容都包含在事务中。将所有操作放入单个 Gremlin 脚本中,您可以在一个事务请求中完成所有操作,而不是承担向服务器发送多个请求的开销。

除非您正在执行诸如自定义模型之类的操作,否则您通常会使用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 Cypher 查询时,请使用cypher存储在对象上的graph对象。

共有三种 Cypher 方法(不幸的是,这些方法尚未在网站上记录):

  1. g.cypher.query():在返回节点/关系列表时使用——它会将它们初始化为对象。
  2. g.cypher.table(): 返回 Cypher 表数据时使用。
  3. g.cypher.exectue():在返回任意数据时使用——它返回一个通用Response对象。

您可以查看源代码以了解它们是如何工作的...

以下是使用 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()

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

于 2013-03-12T09:55:10.137 回答