Performance: Index VS Label

I don’t fully get it yet.

I understand that having a different predicate is the best way to implement labels, so whats better to do?

  • Have different edge predicates (that will change on runtime depending if user adds new labels) for each label in each node with an edge to an end “label” node. For example:
    SET SCHEMA
mutation {
    schema {
        pure_label: bool .
        name: string @index(exact,term) .
        label1: uid @count @reverse .
        label2: uid @count @reverse .
        label3: uid @count @reverse .
    }
}

SET NODES

mutation {
  set {
    _:label1 <name> "label1" .
    _:label1 <pure_label> "true" .
    _:node1_1 <name> "node1_1" .
    _:node1_1 <label1> _:label1 .
    _:node2_1 <name> "node2_1" .
    _:node2_1 <label1> _:label1 .
    
    _:label2 <name> "label2" .
    _:label2 <pure_label> "true" .
    _:node1_2 <name> "node1_2" .
    _:node1_2 <label2> _:label2 .
    _:node2_2 <name> "node2_2" .
    _:node2_2 <label2> _:label2 .
    
    _:label3 <name> "label3" .
    _:label3 <pure_label> "true" .
    _:node1_3 <name> "node1_3" .
    _:node1_3 <label3> _:label3 .
    _:node2_3 <name> "node2_3" .
    _:node2_3 <label3> _:label3 .
  }
}
  • Have different boolean predicates (that will change on runtime depending if user adds new labels) for each label in each node. For example:
    SET SCHEMA:
mutation {
    schema {
        name: string @index(exact,term) .
        label1: bool @count .
        label2: bool @count .
        label3: bool @count .
    }
}

SET NODES

mutation {
  set {
    _:node1_1 <name> "node1_1" .
    _:node1_1 <label1> "true" .
    _:node2_1 <name> "node2_1" .
    _:node2_1 <label1> "true" .
    
    _:node1_2 <name> "node1_2" .
    _:node1_2 <label2> "true" .
    _:node2_2 <name> "node2_2" .
    _:node2_2 <label2> "true" .
    
    _:node1_3 <name> "node1_3" .
    _:node1_3 <label3> "true" .
    _:node2_3 <name> "node2_3" .
    _:node2_3 <label3> "true" .
  }
}