Indexing 需要什么索引来回答一个不连续(_u.or)查询?

Indexing 需要什么索引来回答一个不连续(_u.or)查询?,indexing,gremlin,tinkerpop,janusgraph,Indexing,Gremlin,Tinkerpop,Janusgraph,我想找到一组与给定搜索字符串匹配的User顶点。这些顶点有四个String属性与-FIRST\u NAME、LAST\u NAME、DISPLAY\u NAME和EMAIL匹配。我的查询是这样构造的: 查询 GraphTraversal<Vertex, Vertex> query = GraphFactory.getDefault().traversal().V() .hasLabel(VertexLabel.USER.name()) .or( __.has(P

我想找到一组与给定搜索字符串匹配的
User
顶点。这些顶点有四个
String
属性与-
FIRST\u NAME
LAST\u NAME
DISPLAY\u 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)));
运行查询时,会引发异常

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...
如何重新构造查询和/或索引以使其工作?

尝试使用:

直接索引查询的好处是,您还可以使用以下内容,如果您在多个字段中搜索,这将非常方便。

尝试使用:


直接索引查询的好处在于,您还可以使用类似的功能,如果您在多个字段中搜索,这将非常方便。

太好了,它可以工作!不过,我花了几个小时才弄明白,索引在定义后大约需要一秒钟才能用于直接索引查询;因此,自动测试一直无法找到预期的节点。我可以建议在你的回答中加上这个作为注释吗?感谢您向我介绍此类查询。如果执行查询的索引仅限于一组顶点标签,则只返回带有此类标签的结果,对吗?显然是的,索引将不包含任何其他顶点的数据。太好了,它可以工作!不过,我花了几个小时才弄明白,索引在定义后大约需要一秒钟才能用于直接索引查询;因此,自动测试一直无法找到预期的节点。我可以建议在你的回答中加上这个作为注释吗?感谢您向我介绍这类查询。如果执行查询的索引仅限于一组顶点标签,则只返回带有此类标签的结果,对吗?显然是的,索引将不包含任何其他顶点的数据。
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...
final String searchTerm =
    "v." + PropertyKey.EMAIL_LC.name() + ":(" + regex + ") OR " +
    "v." + PropertyKey.DISPLAY_NAME_LC.name() + ":(" + regex + ") OR " +
    "v." + PropertyKey.FIRST_NAME.name() + ":(" + regex + ") OR " +
    "v." + PropertyKey.LAST_NAME.name() + ":(" + regex + ")";

GraphFactory.getDefault().indexQuery("userSearch", searchTerm).vertices()