JanusGraph索引
GraphIndex是整个图上的全局索引结构,用户可以通过属性高效查询Vertex或Edge,如根据属性查找Vertex或Edge的查询语句:
g.V().has(‘name’,’Alana’)
g.E().hasLabel(‘wife’)
如果没有设置索引,上述的操作将会导致全表扫描,对大图来说是不可取的。
JanusGraph支持两种不同的Graph Index,Composte index和Mixed Index。CompostieIndex非常快并且很高效,但是只能用于相等查询,并且索引需要根据属性键组合预先定义好。Mixed Index可以用于任何索引建的组合查询,并且支持更多的后端索引存储的条件谓词。
1.1 CompositeIndex
Comositeindex通过一个或多个固定的key组合来获取VertexKey或Edge,也即查询条件是在Index中固定的。
例如:
构建根据name查询vertex的组合索引:mgmt.buildIndex('byNameComposite',Vertex.class).addKey(name).buildCompositeIndex()
构建根据name和age查询vertex的组合索引:
mgmt.buildIndex('byNameAndAgeComposite',Vertex.class).addKey(name).addKey(age).buildCompositeIndex()
Composite index需要在查询条件完全匹配的情况下才能触发。且支持匹配,不支持范围查询。
1.1.1 Index Uniqueness
Composite Index也可以作为图的属性约束使用,如果composite graph index被设置为unique(),则只能存在多一个对应的属性组合。
例如:
mgmt.buildIndex('byNameUnique',Vertex.class).addKey(name).unique().buildCompositeIndex()
Mixed Index支持通过其中的任意key的组合查询Vertex或者Edge。Mixed Index使用上更加灵活,而且支持范围查询等;从另外一方面说,Mixedindex效率要比Composite Index低。
与Compositekey不同,Mixed Index需要配置索引后端,JanusGraph可以在一次安装中支持多个索引后端,而且每个索引后端必须使用JanusGraph中配置标识:称为indexing backend name。
例如:
mgmt.buildIndex('nameAndAge',Vertex.class).addKey(name).addKey(age).buildMixedIndex("search"),这里建立了一个名为nameAndAge的索引,该索引使用name和age属性构成,并设定其索引后端为"search",对应到配置文件中为:index.serarch.backend,如果叫solrsearch,则需要增加:index.solrsearch.backend配置。
在使用上,支持范围查询和索引中任何组合查询,而不仅局限于“相等”查询方式:
g.V().has('name', textContains('hercules')).has('age', inside(20,50))
g.V().has('age', lt(50))
Mixed Index支持全文检索,范围检索,地理检索和其他方式。与composite index不同,mixed index不支持性。
Vertex-centric index(顶点中心索引)是为每个vertex建立的本地索引结构,在大型graph中,每个vertex有数千条Edge,在这些vertex中遍历效率将会非常低(需要在内存中过滤符合要求的Edge)。Vertex-centric index可以通过使用本地索引结构加速遍历效率。
如:
h = g.V().has('name','hercules').next()
g.V(h).outE('battled').has('time', inside(10,20)).inV()
如果没有vertex-centric index,则需要遍历所有的batteled边并找出属性time的值符合的记录,在边的数量庞大时效率将会非常低。此时建立一个vertex-centric index可以加速查询:
mgmt.buildEdgeIndex(battled,'battlesByTime',Direction.BOTH,Order.decr, time)
上面对battled边根据属性time以降序建立了双向索引。buildEdgeIndex()方法中的个参数是要索引的Edge的Label,第二个参数是index的名称,第三个参数是边的方向,BOTH意味着可以使用IN/OUT,如果只设置为某一方向,可以减少一半的存储和维护成本。后两个参数是index的排序方向,以及要索引的property key,property key可以是多个,order默认为升序(Order.ASC)。
mgmt.buildEdgeIndex(battled,'battlesByRatingAndTime',Direction.OUT,Order.decr, rating, time)
上面建立了battlesByRatingAndTime索引,并由rating和time构成,需要注意的是构成索引的property key的顺序非常重要,查询时只能根据propety key定义的顺序查询。
可以对一个label创建多个不同的索引来支持不同的遍历。JanusGraph自动选择有效的索引,Vertex-centric仅支持相等和range/interval约束。制
JanusGraph自动为每个edge label的每个property key建立了vertex-centric label,因此即使有数千个边也能高效查询。
到此有关JanusGraph的介绍完毕。
相关文章