2015-07-29 6 views
0

У меня есть миниатюрные ориентированные графы Гремлина, в которых каждая вершина имеет два свойства: «тип» и «текст». Значения свойства «текст» только английский текст, а свойство «тип» может ли иметь значение, выбранное из этого набора:Как написать запросы Gremlin для следующих шаблонов?

NP, PP, VP, ADVP, ADJP, SBAR, PRT, INTJ, O 

Все края в этих графиках имеют одинаковую метку: «Следующий».

Я хочу, чтобы иметь возможность выбрать графики, которые следующие шаблоны узлов:

1) [text=","] --> type="VP" --> type="ADVP" --> type="NP" 
2) type="NP" --> [text="," Upto 3 nodes with any text and type text=","] --> type="VP" --> [text=":" OR "that"] 

Узор элемент в скобках означает, что он не является обязательным.

Итак, для первого шаблона мне нужно выбрать графики, у которых есть узел с текстом «,», а затем узел с типом «VP», а затем «ADVP», а затем «NP».

Для второго шаблона мне нужно выбрать графики, которые имеют тип узла «NP», а затем необязательную последовательность узлов, начиная с узла с текстом «», затем до 3 узлов с любым текстом и типом, а затем узел с текстом ",". За этой необязательной последовательностью следует узел типа «VP» и, наконец, узел с текстом «:» или «that».

Два образца графы, которые соответствуют с первого образца:

Pattern 1

Ниже приведены примеры графиков, которые соответствуют со вторым рисунком: enter image description here

Я понимаю основные Gremlin обходов, но я не являюсь обязательно о том, как обрабатывать дополнительные элементы шаблона выше.

Есть ли способ писать запросы для таких шаблонов в Гремлине? Если нет, можете ли вы предложить подход, основанный не на Гремлине, для создания таких графиков и запросов к ним?

ответ

1

Вы можете сделать сопоставление образцов в Gremlin с TinkerPop 3.0. Вы должны использовать Match Step для выполнения своей задачи. Я написал Гремлин, чтобы сделать это в качестве примера для вашего первого требования. Возможно, это вдохновит вас на развитие обхода для вашего второго требования.

я произвел некоторые данные следующим образом:

gremlin> graph = TinkerGraph.open() 
==>tinkergraph[vertices:0 edges:0] 
gremlin> g = graph.traversal() 
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] 
gremlin> v1=g.addV(id, 1, "type", "o", "text", ",").next() 
==>v[1] 
gremlin> v2=g.withSideEffect('x',v1).addV(id, 2, "type", "vp", "text", "a").addInE('next','x').inV().next() 
==>v[2] 
gremlin> v3=g.withSideEffect('x',v2).addV(id, 3, "type", "advp", "text", "b").addInE('next','x').inV().next() 
==>v[3] 
gremlin> g.withSideEffect('x',v3).addV(id, 4, "type", "np", "text", "c").addInE('next','x').inV().next() 
==>v[4] 
gremlin> 
gremlin> v5=g.addV(id, 5, "type", "vp", "text", "a").next() 
==>v[5] 
gremlin> v6=g.withSideEffect('x',v5).addV(id, 6, "type", "advp", "text", "b").addInE('next','x').inV().next() 
==>v[6] 
gremlin> g.withSideEffect('x',v6).addV(id, 7, "type", "np", "text", "c").addInE('next','x').inV().next() 
==>v[7] 
gremlin> 
gremlin> v8=g.addV(id, 8, "type", "vp", "text", "a").next() 
==>v[8] 
gremlin> v9=g.withSideEffect('x',v8).addV(id, 9, "type", "o", "text", ",").addInE('next','x').inV().next() 
==>v[9] 
gremlin> g.withSideEffect('x',v9).addV(id, 10, "type", "np", "text", "c").addInE('next','x').inV().next() 
==>v[10] 

Тогда для согласования обхода:

gremlin> g.V().has('type','vp').match(__.as('vp').coalesce(__().in().has('text',','),constant("optional")).as('o'), 
gremlin>        __.as('vp').out().has('type','advp').as('advp'), 
gremlin>        __.as('advp').out().has('type','np').as('np')).select('o','vp','advp','np') 
==>[o:v[1], vp:v[2], advp:v[3], np:v[4]] 
==>[o:optional, vp:v[5], advp:v[6], np:v[7]]