我想找到一组与给定搜索字符串匹配的User
个顶点。这些顶点有四个String
属性可与 - FIRST_NAME
,LAST_NAME
,DISPLAY_NAME
和EMAIL
匹配。我的查询构造如下:
查询
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...
我怎样才能重构查询和/或索引以使其起作用?
答案 0 :(得分:2)
尝试使用the docs:
override class var outputFormat: CIFormat {
return kCIFormatBGRA8
}
override class func formatForInput(at input: Int32) -> CIFormat {
return kCIFormatBGRA8
}
关于直接索引查询的好处是,您还可以使用direct index query之类的内容,如果您搜索多个字段,这样会很方便。