我有一些微型Gremlin有向图,其中每个顶点都有两个属性“type”和“text”。 “text”属性的值只是英文文本,而“type”属性可以是从该集合中选择的值:
NP, PP, VP, ADVP, ADJP, SBAR, PRT, INTJ, O
这些图中的所有边都有相同的标签:“next”。
我希望能够选择具有以下节点模式的图形:
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"]
括号中的pattern元素表示它是可选的。
因此,对于第一个模式,我需要选择具有带文本“,”的节点的图形,可选地后跟一个类型为“VP”的节点,然后是“ADVP”,然后是“NP”。
对于第二种模式,我需要选择节点类型为“NP”的图形,然后是一个可选的节点序列,以带有文本“,”的节点开始,然后是3个带有任何文本和类型的节点,然后是带有文本“,”的节点。然后,此可选序列后跟一个类型为“VP”的节点,最后是一个带有文本“:”或“that”的节点。
两个与第一个模式匹配的示例图表是:
我理解基本的Gremlin遍历,但我不确定如何处理上述模式的可选元素。
有没有办法在Gremlin中为这些模式编写查询?如果没有,您能否建议使用基于非Gremlin的方法来创建此类图表并查询它们?
答案 0 :(得分:1)
你可以在TinkerPop 3.0中使用Gremlin进行模式匹配。您可以使用Match Step来完成任务。我已经写过Gremlin作为你的第一个要求的例子。也许这会激励你为第二个要求开发遍历。
我生成了一些数据如下:
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]]