JanusGraph-关于在创建索引后扫描所有顶点的警告

时间:2018-07-17 17:37:01

标签: gremlin tinkerpop3 janusgraph

我正在使用Janusgraph 0.2.0,并定义了以下顶点(在Python中):

class Airport(TypedVertex):
    type = goblin.VertexProperty(goblin.String, card=Cardinality.single)
    airport_code = goblin.VertexProperty(goblin.String, 
        card=Cardinality.single)
    airport_city = goblin.VertexProperty(goblin.String, 
        card=Cardinality.single)
    airport_name = goblin.VertexProperty(goblin.String, 
        card=Cardinality.single)
    airport_region = goblin.VertexProperty(goblin.String, 
        card=Cardinality.single)
    airport_runways = goblin.VertexProperty(goblin.Integer, 
        card=Cardinality.single)
    airport_longest_runway = goblin.VertexProperty(goblin.Integer, 
        card=Cardinality.single)
    airport_elev = goblin.VertexProperty(goblin.Integer, 
        card=Cardinality.single)
    airport_country = goblin.VertexProperty(goblin.String, 
        card=Cardinality.single)
    airport_lat = goblin.VertexProperty(goblin.Float, 
        card=Cardinality.single)
    airport_long = goblin.VertexProperty(goblin.Float, 
        card=Cardinality.single)

然后我使用以下命令在机场代码字段上为此节点定义了一个索引(排除了一些命令以使其简短)。

mgmt.makePropertyKey('type').dataType(String.class).cardinality(Cardinality.SINGLE).make()
mgmt.makePropertyKey('airport_city').dataType(String.class).cardinality(Cardinality.SINGLE).make()
mgmt.makePropertyKey('airport_code').dataType(String.class).cardinality(Cardinality.SINGLE).make()
mgmt.makePropertyKey('airport_country').dataType(String.class).cardinality(Cardinality.SINGLE).make()
airport_code = mgmt.getPropertyKey('airport_code')
airport_city = mgmt.getPropertyKey('airport_city')
airport_country = mgmt.getPropertyKey('airport_country')
mgmt.buildIndex('by_airport_code_unique', Vertex.class).addKey(airport_code).unique().buildCompositeIndex()
mgmt.buildIndex('by_airport_city', Vertex.class).addKey(airport_city).buildCompositeIndex()
mgmt.buildIndex('by_airport_country', Vertex.class).addKey(airport_country).buildCompositeIndex()
mgmt.awaitGraphIndexStatus(graph, 'by_airport_code_unique').call()
mgmt.awaitGraphIndexStatus(graph, 'by_airport_city').call()
mgmt.awaitGraphIndexStatus(graph, 'by_airport_country').call()

创建后,我使用脚本描述:schema,然后看到所有索引都已注册:

| Graph Index .          | Type .    | Element          | Unique | Backing  | PropertyKey  | Status    |
|-----------------------:|:-----|:--------|:-------|:--------|:-----------|:--------|
| by_airport_code_unique | Composite | JanusGraphVertex |   true | internalindex | airport_code | REGISTERED |
| by_airport_city | Composite | JanusGraphVertex | false | internalindex | airport_city | REGISTERED |
| by_airport_country | Composite | JanusGraphVertex |  false | internalindex | airport_country | REGISTERED |

当我尝试按预期插入具有相同airport_code的第二个顶点时,出现约束违例异常。但是,如果我进入gremlin控制台并进行遍历以按照其airport_code来检索顶点:

g.V().has('airport_code').values()

我得到警告: WARN org.janusgraph.graphdb.transaction.StandardJanusGraphTx-查询需要遍历所有顶点[()]。为了获得更好的性能,请使用索引

几周前,我遇到了类似的问题,问题是我试图基于标签定义索引,而当时我被告知janusgraph不支持标签索引。但是,我认为情况并非如此。 关于为什么我的索引不起作用或不被使用的任何建议或想法? 在此先感谢您的帮助。 --MD

1 个答案:

答案 0 :(得分:1)

您看到警告,因为您的查询未使用索引。 composite index用于相等性匹配。

  

复合索引非常快速高效,但仅限于对特定的,先前定义的属性键组合进行相等查找。混合索引可用于对索引键的任何组合进行查找,并且除了根据支持索引存储库的相等性以外,还支持多个条件谓词。

为了利用复合索引,您需要提供该属性和一个值以进行匹配。例如:

g.V().has('airport_code', 'JFK').toList()

我不确定创建索引后为什么没有ENABLED,也许是您遗漏的步骤中的某些内容。如果您在与属性键相同的管理事务中创建索引,则索引应为ENABLED而不是REGISTERED。查看index lifecycle Wiki。