【发布时间】:2018-01-15 06:25:05
【问题描述】:
我想找到一组与给定搜索字符串匹配的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 索引(注释为“用户搜索”),以确保唯一性/与单个属性匹配。
索引
//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...
我如何重组查询和/或索引以使其正常工作?
【问题讨论】:
标签: indexing gremlin tinkerpop janusgraph