不使用模型在灯泡流中选择性索引

时间:2013-11-13 18:51:21

标签: python neo4j bulbs

我正在使用带有Neo4j的bulbflow(python),我正在尝试在我的键的一个子集上添加一个的索引(现在,只需将名为'name'的键作为可选索引 - 基于查找)。

我不喜欢bulbflow模型(限制性太强)而且我无法弄清楚如何在不更改代码的情况下进行选择性索引,因为'autoindex'是一个全局设置 - 我不知道如何配置它基于密钥。

有人做过这样的事吗?

-Andrew

1 个答案:

答案 0 :(得分:2)

您可以将g.config.autoindex设置为False来停用灯泡自动编制索引。

请参阅https://github.com/espeed/bulbs/blob/master/bulbs/config.py#L62

>>> from bulbs.neo4jserver import Graph
>>> g = Graph()
>>> g.config.autoindex = False
>>> g.vertices.create(name="James")

在上面的示例中,这将导致name属性不会自动编入索引。

autoindex设置为False将切换为使用低级客户端的create_vertex()方法而不是create_indexed_vertex()方法:

请参阅https://github.com/espeed/bulbs/blob/master/bulbs/neo4jserver/client.py#L422

create_indexed_vertex()方法有一个keys arg,您可以将其用于选择性索引:

请参阅https://github.com/espeed/bulbs/blob/master/bulbs/neo4jserver/client.py#L424

这是Bulbs模型使用的低级client方法。您通常不需要显式调用低级客户端方法,但如果这样做,您可以通过在键arg中包含属性名称来选择性地索引属性。

要有选择地为模型中的属性编制索引,只需在模型定义中覆盖get_index_keys()

请参阅https://github.com/espeed/bulbs/blob/master/bulbs/model.py#L383

默认情况下,灯泡模型会索引所有属性。如果未提供密钥,则会对所有属性编制索引(如TinkerPop / Blueprints中所示)。

参见Model _create()和get_bundle()方法:

要为通用顶点和边缘启用选择性索引,我更新了Bulbs通用顶点/边缘方法以包含_keys arg,您可以在其中提供索引的属性名称(键)列表。

请参阅https://github.com/espeed/bulbs/commit/4fe39d5a76675020286ec9aeaa8e71d58e3a432a

现在,要有选择地索引通用顶点/边的属性,可以提供索引的属性名列表:

>>> from bulbs.neo4jserver import Graph
>>> g = Graph()
>>> g.config.autoindex = False
>>> james = g.vertices.create(name="James", city="Dallas", _keys=["name"])
>>> julie = g.vertices.create(name="Julie", city="Dallas", _keys=["name"])
>>> g.edges.create(james, "knows", julie, timestamp=12345, someprop="somevalue", _keys=["someprop"])

在上面的示例中,将为每个顶点索引name属性,并为边缘索引someprop。请注意,citytimestamp将不会被编入索引,因为这些属性名称未明确包含在索引键列表中。

如果g.config.autoindexTrue_keysNone(默认值),则会对所有属性编制索引(就像之前一样)。

如果g.config.autoindexFalse_keysNone,则不会对任何属性编制索引。

如果_keys显式设置为属性名称列表,则只会对这些属性编制索引,无论g.config.autoindexTrue还是False

请参阅https://github.com/espeed/bulbs/blob/master/bulbs/neo4jserver/client.py#L422

注意:如果您使用Neo4j Server,Rexster或Titan Server,自动索引的工作原理会有所不同,并且所有图形数据库服务器的索引体系结构都处于以下状态:过去几个月的流量。似乎所有人都在从手动索引系统转向自动索引。

对于直到最近才具有自动索引功能的图形数据库服务器(例如Neo4j Server),Bulbs通过使用数据库的低级手动索引方法的自定义Gremlin脚本启用了自动索引:

但是,Neo4j Server,TinkerPop / Rexster和Titan Server之间的手动索引已被弃用,因此Bulbs 0.4索引体系结构将相应更改。通过像在SQL create table语句中那样预先声明索引键,仍然可以进行选择性索引。

顺便说一句:你怎么看待模特的限制?灯泡模型(实际上是整个库)设计灵活,因此您可以根据需要进行修改。

有关如何自定义灯泡模型的信息,请参阅灯泡示例:Is there a equivalent to commit in bulbs framework for neo4j

如果您有任何问题,请与我们联系。