2016-04-14 6 views
1

Во время моего перехода из ТР2 0,54 -> ТР3 титаном 1,0/Tinkerpop 3,01Как сделать логику OR между вершинных индексов в Titan 1,0/ТР3 3.01 с использованием предиката текста

Я пытаюсь построить Gremlin запрос, которые делают «логическое ИЛИ "с Predicate Текст, между свойствами на различных индексов Vertex

Что-то вроде:

------------------- Предопределенная ES INDEXES: --- ---------------

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" match текст содержит префикс, ИЛИ все вершины с свойством "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 шаг с дедушкой, но gremlin throws error ...

Спасибо за любую помощь

Виталий

+0

Почему не выполнялся шаг 'or()'? Как выглядела ваша попытка с 'или()'? http://tinkerpop.apache.org/docs/3.0.1-incubating/#or-step –

+0

gV(). или (_(). has ('storyContent', textContainsPrefix ("abc")), _() .has ('userContent', textContainsPrefix ("dca"))), но также я хочу добавить шаг дедуги, чтобы игнорировать повторяющиеся вершины -------------------- ------------------------- Ошибка : ---------------------- --------- Нет сигнатуры метода: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.call() применим для типов аргументов:() значения: [] Возможные решения : tail(), wait(), any(), max(), wait (long), each (groovy.lang.Closure) Показать трассировку стека? [yN] – VitalyT

+0

Можете ли вы обновить свой вопрос с помощью примерного графика и ожидаемого результата (в терминах вершин)? –

ответ

5

Как о чем-то вдоль этих линий:

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

Edit - как уже упоминалось в комментариях, этот запрос не будет использовать любой индекс. Он должен быть разделен на два отдельных запроса.

См. TinkerPop v3.0.1 Drop Step documentation и Titan v1.0.0 Ch. 20 - Index Parameters and Full-Text Search documentation.

С Titan, вы, возможно, придется импортировать текстовые предикаты перед:

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

_.() является TinkerPop2 материал и больше не используется в TinkerPop3. Теперь вы используете анонимные обходы в качестве предикатов, которые иногда должны начинаться с __. для шагов с зарезервированными ключевыми словами в Groovy (например, __.in()).

+0

спасибо, человек, у гремлина его работы, но медленный, теперь у меня есть 2 вопроса: 1. Проблема JAVA: GraphTraversalSource g = tg.traversal(); GraphTraversal t = g.V(); // работает Список работ = t.has ("nodeType", "USER"). ToList(); // нет, почему? Список throwsExecption = t.or (t.has ("nodeType", "USER"), t.has ("nodeType", "STORY")). ToList(); 2. Это другой способ сделать поиск по разным вершинам без использования шага OR (из-за проблем с производительностью)? Thanks – VitalyT

+3

Этот запрос не будет использовать какой-либо индекс. Чтобы на самом деле использовать 2 определенных индекса, вам придется разделить их на 2 отдельных запроса. –

+0

Но если бы я создал 1 «смешанный» индекс поиска с обоими свойствами как ключи («storyContent» и «userContent»), а затем сделать запрос OR, как на предыдущем шаге, например: -----> «gV() .или (имеет ('storyContent', textContainsPrefix ("abc")), имеет ('userContent', textContainsPrefix ("dcc"))), это решит проблему? – VitalyT

 Смежные вопросы

  • Нет связанных вопросов^_^