如何为以下模式编写 Gremlin 查询?
How do I write Gremlin queries for following patterns?
我有一些微型 Gremlin 有向图,其中每个顶点都有两个属性 "type" 和 "text"。 "text" 属性 的值只是英文文本,而 "type" 属性 的值可以从这个集合中得到 select:
NP, PP, VP, ADVP, ADJP, SBAR, PRT, INTJ, O
这些图中的所有边都具有相同的标签:"next"。
我希望能够 select 具有以下节点模式的图表:
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"]
括号中的模式元素表示它是可选的。
因此,对于第一个模式,我需要 select 具有文本“,”节点的图表(可选),后跟类型为 "VP" 的节点,然后是 "ADVP",接着是 "NP"。
对于第二种模式,我需要 select 具有节点类型 "NP" 的图形,后跟一个可选的节点序列,以带有文本“,”的节点开始,然后最多 3 个节点带有任何文本和类型,然后是带有文本“,”的节点。这个可选序列之后是一个 "VP" 类型的节点,最后是一个带有文本“:”或 "that".
的节点
与第一个模式匹配的两个示例图是:
以下是与第二种模式匹配的示例图:
我了解基本的 Gremlin 遍历,但我不确定如何处理上述模式的可选元素。
有什么方法可以在 Gremlin 中编写针对此类模式的查询吗?如果没有,您能否建议一种基于非 Gremlin 的方法来创建此类图形并查询它们?
从 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]]
我有一些微型 Gremlin 有向图,其中每个顶点都有两个属性 "type" 和 "text"。 "text" 属性 的值只是英文文本,而 "type" 属性 的值可以从这个集合中得到 select:
NP, PP, VP, ADVP, ADJP, SBAR, PRT, INTJ, O
这些图中的所有边都具有相同的标签:"next"。
我希望能够 select 具有以下节点模式的图表:
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"]
括号中的模式元素表示它是可选的。
因此,对于第一个模式,我需要 select 具有文本“,”节点的图表(可选),后跟类型为 "VP" 的节点,然后是 "ADVP",接着是 "NP"。
对于第二种模式,我需要 select 具有节点类型 "NP" 的图形,后跟一个可选的节点序列,以带有文本“,”的节点开始,然后最多 3 个节点带有任何文本和类型,然后是带有文本“,”的节点。这个可选序列之后是一个 "VP" 类型的节点,最后是一个带有文本“:”或 "that".
的节点与第一个模式匹配的两个示例图是:
以下是与第二种模式匹配的示例图:
我了解基本的 Gremlin 遍历,但我不确定如何处理上述模式的可选元素。
有什么方法可以在 Gremlin 中编写针对此类模式的查询吗?如果没有,您能否建议一种基于非 Gremlin 的方法来创建此类图形并查询它们?
从 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]]