我正在使用带有 Neo4j 的bulbflow(python),并且我正在尝试仅在我的键的子集上添加索引(现在,只是名为“name”的键用于可选的基于索引的查找)。
我不喜欢灯泡流模型(限制性太强),而且我不知道如何在不更改代码的情况下进行选择性索引,因为“自动索引”是一个全局设置——我不知道如何根据钥匙。
有没有人做过这样的事情?
-安德鲁
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
这是灯泡模型使用的低级client
方法。您通常不需要显式调用低级客户端方法,但如果这样做,您可以通过在键 arg 中包含属性名称来选择性地索引属性。
要选择性地索引模型中的属性,只需get_index_keys()
在模型定义中覆盖:
见https://github.com/espeed/bulbs/blob/master/bulbs/model.py#L383
默认情况下,灯泡模型索引所有属性。如果没有提供键,那么所有属性都会被索引(就像在 TinkerPop/Blueprints 中一样)。
请参阅模型 _create() 和 get_bundle() 方法:
_create()
https://github.com/espeed/bulbs/blob/master/bulbs/model.py#L583get_bundle()
https://github.com/espeed/bulbs/blob/master/bulbs/model.py#L363get_index_keys()
https://github.com/espeed/bulbs/blob/master/bulbs/model.py#L383为了对通用顶点和边启用选择性索引,我更新了 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
索引,并将为边缘建立索引。请注意,city
并且timestamp
不会被索引,因为这些属性名称未明确包含在索引键列表中。
如果g.config.autoindex
isTrue
和_keys
is None
(默认),所有属性都将被索引(就像以前一样)。
如果g.config.autoindex
isFalse
和_keys
is None
,则不会索引任何属性。
如果_keys
显式设置为属性名称列表,则只有那些属性将被索引,无论g.config.autoindex
是True
还是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 索引架构将相应更改。选择性索引仍然可以通过预先声明索引键来实现,就像在 SQLcreate table
语句中一样。
顺便说一句:你觉得模型有什么限制吗?Bulbs Models(实际上是整个库)的设计非常灵活,因此您可以根据需要对其进行修改。
有关如何自定义灯泡模型的信息,请参阅灯泡示例:neo4j 的灯泡框架中是否有等效提交
如果您有任何问题,请告诉我。