【问题标题】:Selective indexing in bulbflow without using Models不使用模型的灯泡流中的选择性索引
【发布时间】:2013-11-13 18:51:21
【问题描述】:

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

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

有人做过这样的事吗?

-安德鲁

【问题讨论】:

  • 感谢 LC,我一直在研究这些,但它的 API 级别非常低。基本上,我只想对某些属性进行选择性自动索引。使用这个低级 API,看起来我必须进行常规数据写入,然后创建一个 Neo4jClient 对象,以便在修改任何内容时调用方法“create_indexed_vertex”和“update_indexed_vertex”。我可以去 VertexIndexProxy 类,但这似乎没有必要,除非我错过了一些东西。不管怎样,有点麻烦。

标签: python neo4j bulbs


【解决方案1】:

您可以通过将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 参数,可用于选择性索引:

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

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

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

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

默认情况下,灯泡模型索引所有属性。如果没有提供键,那么所有属性都会被索引(就像在 TinkerPop/Blueprints 中一样)。

查看模型的 _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 服务器、Rexster 或 Titan 服务器,自动索引的工作方式会有所不同,并且所有图形数据库服务器的索引架构都处于过去几个月的流量。似乎所有人都在从手动索引系统转向自动索引系统。

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

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

顺便说一句:你觉得模特有什么限制吗? Bulbs Models(实际上是整个库)的设计非常灵活,因此您可以根据需要对其进行修改。

请参阅灯泡示例了解如何自定义灯泡模型:Is there a equivalent to commit in bulbs framework for neo4j

如果您有任何问题,请告诉我。

【讨论】:

  • 关于灯泡模型是“限制性的”——这肯定是错误的词。我们的数据模型相对简单且流畅(没有关于边的数据,只有两种类型的边标签,无循环树连接而不是一般图,并且仅在顶点上经常更改属性键值)所以我没有需要模型的轻微开销。
猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 2012-10-29
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多