对 JanusGraph 的 Gremling 控制台查询随机缓慢

Gremling console queries to JanusGraph are randomly slow

我有一个超级简单的 gremlin 查询,我使用 gremlin 控制台将其发送到 IBM Cloud 托管的 JanusGraph。奇怪的是,执行时间有时非常快,然后又非常慢。那会是什么? 属性 uid 是字符串类型,可以是 GUID,也可以是其他类型。

gremlin> g.V().has('uid', 'f287342c-ff84-4102-8f18-f3aa759470a7').hasLabel('product').profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
JanusGraphStep([],[uid.eq(f287342c-ff84-4102-8f...                     1           1        1107.212   100.00
    \_condition=(uid = f287342c-ff84-4102-8f18-f3aa759470a7 AND ~label = product)
    \_isFitted=false
    \_query=[]
    \_orders=[]
    \_isOrdered=true
  optimization                                                                                 0.014
  optimization                                                                                 0.055
  scan                                                                                         0.000
    \_condition=VERTEX
    \_query=[]
    \_fullscan=true
                                            >TOTAL                     -           -        1107.212        -
gremlin> g.V().has('uid', 'f287342c-ff84-4102-8f18-f3aa759470a7').hasLabel('product').profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
JanusGraphStep([],[uid.eq(f287342c-ff84-4102-8f...                     1           1         129.861   100.00
    \_condition=(uid = f287342c-ff84-4102-8f18-f3aa759470a7 AND ~label = product)
    \_isFitted=false
    \_query=[]
    \_orders=[]
    \_isOrdered=true
  optimization                                                                                 0.014
  optimization                                                                                 0.056
  scan                                                                                         0.000
    \_condition=VERTEX
    \_query=[]
    \_fullscan=true
                                            >TOTAL                     -           -         129.861        -
gremlin> g.V().has('uid', 'f287342c-ff84-4102-8f18-f3aa759470a7').hasLabel('product').profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
JanusGraphStep([],[uid.eq(f287342c-ff84-4102-8f...                     1           1        2581.514   100.00
    \_condition=(uid = f287342c-ff84-4102-8f18-f3aa759470a7 AND ~label = product)
    \_isFitted=false
    \_query=[]
    \_orders=[]
    \_isOrdered=true
  optimization                                                                                 0.024
  optimization                                                                                 0.094
  scan                                                                                         0.000
    \_condition=VERTEX
    \_query=[]
    \_fullscan=true
                                            >TOTAL                     -           -        2581.514

我通过向 属性 uid 添加索引找到了解决方案。我想,JanusGraph 会自动执行此操作,但事实并非如此。在 JanusGraph gramlin 控制台上使用以下步骤。

gremlin> graph = ConfiguredGraphFactory.open('g')
gremlin> mgmt = graph.openManagement()
gremlin> uidKey = mgmt.getPropertyKey('uid')
gremlin> mgmt.buildIndex('uidIndex', Vertex.class).addKey(uidKey ).buildCompositeIndex()
gremlin> mgmt.commit()

这是对 JanusGraph documentation 的改编。