Как сделать логику ИЛИ между индексами вершин в Titan 1.0 / TP3 3.01 с использованием текста предиката

Во время перехода с TP2 0.54 на TP3 titan 1.0 / Tinkerpop 3.01

Я пытаюсь создать запрос gremlin, который делает «логическое ИЛИ» с текстом предиката между свойствами в разных индексах вершин

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

------------------- ПРЕДНАЗНАЧЕННЫЕ ИНДЕКСЫ 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 дублируется, поэтому должен игнорироваться шагом дедупликации

 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 с дедупликацией, но гремлин выдает ошибку ...

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

Виталий


person VitalyT    schedule 14.04.2016    source источник
comment
Почему не сработал or() шаг? Как выглядела ваша попытка с or()? tinkerpop.apache.org/docs/3.0.1-incubating/# или-шаг   -  person Jason Plurad    schedule 14.04.2016
comment
gV (). или (_ (). has ('storyContent', textContainsPrefix (abc)), _ (). has ('userContent', textContainsPrefix (dca))), но я также хочу добавить шаг дедупликации, чтобы игнорировать повторяющиеся вершины --------------------------------------------- ошибка : ------------------------------- Нет сигнатуры метода: org.apache.tinkerpop.gremlin.process.traversal.dsl .graph.DefaultGraphTraversal.call () применим для типов аргументов: () values: [] Возможные решения: tail (), wait (), any (), max (), wait (long), each (groovy.lang. Закрытие) Отобразить трассировку стека? [yN]   -  person VitalyT    schedule 14.04.2016
comment
Можете ли вы дополнить свой вопрос образцом графа и ожидаемым результатом (с точки зрения вершин)?   -  person Jason Plurad    schedule 14.04.2016
comment
я обновил свой вопрос, спасибо! :)   -  person VitalyT    schedule 14.04.2016


Ответы (1)


Как насчет чего-нибудь в этом роде:

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

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

См. документацию по Drop Step и Titan v1.0.0 гл. 20 - Документация по параметрам индекса и полнотекстовому поиску.

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

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

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

person jbmusso    schedule 14.04.2016
comment
спасибо, чувак, в гремлине он работает, но медленно. Теперь у меня 2 проблемы: 1. Проблема с JAVA: GraphTraversalSource g = tg.traversal (); GraphTraversal t = g.V (); // работает List works = t.has (nodeType, USER) .toList (); // нет, почему? Список throwsExecption = t.or (t.has (nodeType, USER), t.has (nodeType, STORY)). ToList (); 2. Есть ли другой способ выполнить поиск в разных вершинах без использования шага ИЛИ (из-за проблем с производительностью)? Спасибо - person VitalyT; 15.04.2016
comment
Этот запрос не будет использовать какой-либо индекс. Чтобы на самом деле использовать 2 определенных индекса, вам придется разделить их на 2 отдельных запроса. - person Daniel Kuppitz; 15.04.2016
comment
Но если бы я создал 1 смешанный поисковый индекс с обоими свойствами в качестве ключей (storyContent и userContent), а затем сделал бы запрос OR, как на предыдущем шаге, например: ----- ›gV (). Or (has ('storyContent', textContainsPrefix ( abc)), has ('userContent', textContainsPrefix (dcc))), это решило бы проблему? - person VitalyT; 15.04.2016
comment
Я отредактировал ответ, чтобы учесть комментарий @ DanielKuppitz относительно использования индекса. - person jbmusso; 15.04.2016
comment
Я вижу, спасибо, но как лучше всего сделать запрос с условием шага, например: ИЛИ, И с использованием нескольких индексов? Я не хочу использовать прямой запрос индекса - person VitalyT; 16.04.2016