回答析取(__。或)查询需要什么索引?

时间:2018-01-15 06:25:05

标签: indexing gremlin tinkerpop janusgraph

我想找到一组与给定搜索字符串匹配的User个顶点。这些顶点有四个String属性可与 - FIRST_NAMELAST_NAMEDISPLAY_NAMEEMAIL匹配。我的查询构造如下:

查询

GraphTraversal<Vertex, Vertex> query = GraphFactory.getDefault().traversal().V()
    .hasLabel(VertexLabel.USER.name())
    .or(    __.has(PropertyKey.EMAIL_LC.name(), Text.textRegex(regex)),
            __.has(PropertyKey.DISPLAY_NAME_LC.name(), Text.textRegex(regex)),
            __.has(PropertyKey.FIRST_NAME.name(), Text.textRegex(regex)),
            __.has(PropertyKey.LAST_NAME.name(), Text.textRegex(regex)));

要回答它,有一个主要的MIXED索引(评论&#34;用户搜索&#34;),以确保对单个属性的唯一性/匹配。

索引

//Unique Email Addresses - COMPOSITE
mgmt.buildIndex("byEmailComp", Vertex.class)
    .addKey(emailLowercaseKey)
    .indexOnly(userLabel)
    .unique()
    .buildCompositeIndex();

//Unique Email Addresses - MIXED
mgmt.buildIndex("byEmailMixed", Vertex.class)
    .addKey(emailLowercaseKey, Mapping.TEXTSTRING.asParameter())
    .indexOnly(userLabel)
    .buildMixedIndex("search");

//Unique Display Name - COMPOSITE
mgmt.buildIndex("byDisplayNameComp", Vertex.class)
    .addKey(displayNameLowercaseKey)
    .indexOnly(userLabel)
    .unique()
    .buildCompositeIndex();

//Unique Display Name - MIXED
mgmt.buildIndex("byDisplayNameMixed", Vertex.class)
    .indexOnly(userLabel)
    .addKey(displayNameLowercaseKey, Mapping.TEXTSTRING.asParameter())
    .buildMixedIndex("search");

//User search - MIXED
mgmt.buildIndex("userSearch", Vertex.class)
    .indexOnly(userLabel)
    .addKey(displayNameLowercaseKey, Mapping.TEXTSTRING.asParameter())
    .addKey(emailLowercaseKey, Mapping.TEXTSTRING.asParameter())
    .addKey(firstNameKey, Mapping.TEXTSTRING.asParameter())
    .addKey(lastNameKey, Mapping.TEXTSTRING.asParameter())
    .buildMixedIndex("search");

运行查询时,会抛出异常。

Query needs suitable index to be answered [(~label = USER)]:VERTEX

但是,如果我一次匹配一个属性,则不会抛出任何异常。像这样:

GraphFactory.getDefault().traversal().V()
    .hasLabel(VertexLabel.USER.name())
    .has(PropertyKey.EMAIL_LC.name(), Text.textRegex(regex));

// or

GraphFactory.getDefault().traversal().V()
    .hasLabel(VertexLabel.USER.name())
    .has(PropertyKey.DISPLAY_NAME_LC.name(), Text.textRegex(regex));

// or...

我怎样才能重构查询和/或索引以使其起作用?

1 个答案:

答案 0 :(得分:2)

尝试使用the docs

override class var outputFormat: CIFormat {
    return kCIFormatBGRA8
}
override class func formatForInput(at input: Int32) -> CIFormat {
    return kCIFormatBGRA8
}

关于直接索引查询的好处是,您还可以使用direct index query之类的内容,如果您搜索多个字段,这样会很方便。