Bulbs支持三种不同的图形数据库服务器——Neo4j Server、Rexster和现在的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_entry
Entry 模型使用的 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 方法(不幸的是,这些方法尚未在网站上记录):
g.cypher.query()
:在返回节点/关系列表时使用——它会将它们初始化为对象。
g.cypher.table()
: 返回 Cypher 表数据时使用。
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 将尝试将其初始化为特定类型,否则它将默认为泛型Vertex
或Edge
.
请注意,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()
如果您还有其他问题,请告诉我。