1

在我从 TP2 0.54 -> TP3 titan 1.0 / Tinkerpop 3.01 迁移期间

我正在尝试构建 gremlin 查询,该查询在不同顶点索引的属性之间使用 Predicate Text 进行“逻辑或”

就像是:

------------------- 预定义的 ES 索引: ------------------

tg = TitanFactory.open('../conf/titan-cassandra-es.properties')
tm = tg.openManagement();
g=tg.traversal();

      PropertyKey pNodeType = createPropertyKey(tm, "nodeType", String.class, Cardinality.SINGLE);
      PropertyKey userContent = createPropertyKey(tm, "storyContent", String.class, Cardinality.SINGLE);
      PropertyKey storyContent = createPropertyKey(tm, "userContent", String.class, Cardinality.SINGLE);

            //"storyContent" : is elasticsearch backend index - mixed
            tm.buildIndex(indexName, Vertex.class).addKey(storyContent, Mapping.TEXTSTRING.asParameter()).ib.addKey(pNodeType, Mapping.TEXTSTRING.asParameter()).buildMixedIndex("search");

            //"userContent" : is elasticsearch backend index - mixed
            tm.buildIndex(indexName, Vertex.class).addKey(userContent, Mapping.TEXTSTRING.asParameter()).ib.addKey(pNodeType, Mapping.TEXTSTRING.asParameter()).buildMixedIndex("search");


            v1= g.addVertex()
            v1.property("nodeType","USER")
            v1.property("userContent" , "dccsdsadas")

            v2= g.addVertex()
            v2.property("nodeType","STORY")
            v2.property("storyContent" , "abdsds")

            v3= g.addVertex()
            v3.property("nodeType","STORY")
            v3.property("storyContent" , "xxxx")              

            v4= g.addVertex()
            v4.property("nodeType","STORY")
            v4.property("storyContent" , "abdsds") , etc'...

- - - - - - - - - - 预期结果: - - - - - -

我想返回所有具有属性“storyContent”的顶点匹配文本包含前缀,或者所有具有匹配其大小写的属性“userContent”的顶点。
在这种情况下返回 v1 和 v2 ,因为 v3 不匹配并且 v4 重复,因此必须通过 dedup 步骤忽略它

 g.V().has("storyContent", textContainsPrefix("ab")) "OR" has("userContent", textContainsPrefix("dc"))

或者可能 :

g.V().or(_().has('storyContent', textContainsPrefix("abc")), _().has('userContent', textContainsPrefix("dcc")))

PS,

我以为使用 TP3 OR step 与 dedup ,但 gremlin 抛出错误......

谢谢你的帮助

维塔利

4

1 回答 1

5

沿着这些思路怎么样:

g.V().or(
    has('storyContent', textContainsPrefix("abc")),
    has('userContent', textContainsPrefix("dcc"))
)

编辑 - 如评论中所述,此查询不会使用任何索引。它必须分成两个单独的查询。

请参阅 TinkerPop v3.0.1 Drop Step 文档和 Titan v1.0.0 Ch。20 - 索引参数和全文搜索文档

使用 Titan,您可能必须先导入文本谓词:

import static com.thinkaurelius.titan.core.attribute.Text.*

_.()是 TinkerPop2 材料,在 TinkerPop3 中不再使用。您现在使用匿名遍历作为谓词,有时必须从__.Groovy 中使用保留关键字命名的步骤开始(例如 . __.in())。

于 2016-04-14T21:29:11.057 回答