我如何 select 具有相同属性值的边
How do I select edges that have same value of attributes
这是一个示例图
gremlin> v1 = graph.addVertex(id, 1, label,"cell_1")
gremlin> v2 = graph.addVertex(id, 2, label,"cell_2")
gremlin> v1.addEdge("test",v2,id,3,"srving_rsrp",20,"nbr_rsrp",30)
gremlin> v1.addEdge("test",v2,id,4,"srving_rsrp",30,"nbr_rsrp",30)
gremlin> v1.addEdge("test",v2,id,5,"srving_rsrp",10,"nbr_rsrp",40)
我需要得到 "srving_rsrp" 和 "nbr_rsrp" 值相等的边。我找不到适合它的好例子
这是我到达的地方;而不是每个我都想使用过滤器来创建一个只有符合条件的边缘的图形。我正在使用 Titan (1.0.0-hadoop)
附带的 Germlin shell
g.V(1).outE('test').each{ it.property('srving_rsrp').value == it.property('nbr_rsrp').value}
我可以在 Python 中使用 NetworK 轻松完成此操作;这是我想使用 Germlin
实现的代码
G = nx.MultiDiGraph() # Create a network Graph
G.add_edge(2,3, time=10,srvingcell=20,neighbourcell=50)
G.add_edge(2,3, time=20,srvingcell=30,neighbourcell=30)
G.add_edge(2,3, time=30,srvingcell=28,neighbourcell=40)
G.add_edge(2,3, time=5,srvingcell=27,neighbourcell=85)
G.edges(data=True)
cutoff = 25
SG=nx.Graph( [ (u,v,d) for u,v,d in G.edges(data=True) if d['srvingcell'] == d['neighbourcell']] )
SG.edges(data=True)
nx.write_gml(SG, "test.gml")
一个简单的答案就是将 each
更改为 filter
:
gremlin> g.V(1).outE('test').filter{ it.get().property('srving_rsrp').value == it.get().property('nbr_rsrp').value}
==>e[4][1-test->2]
但是它使用了 lambda,如果可能的话最好避免使用它们。我不确定以下内容是否适用于 Gremlin 3.0.x(这是 Titan 1.0.0 所基于的),但您可以通过以下方式摆脱 labmda:
gremlin> g.V(1).outE('test').as('x','y').
filter(select('x','y').
by('srving_rsrp').by('nbr_rsrp').
where('x',eq('y')))
==>e[4][1-test->2]
您基本上为边缘提供两个标签 "x" 和 "y",然后应用过滤器。在过滤器中,您 select "x" 和 "y" 标签,对于 "x",您获取 "srving_rsrp" 属性 值,对于 "y" 你获取 "nbr_rsrp" 属性 值并过滤那些 eq
(相等)的值。
这是 TinkerPop 食谱中讨论的 Traversal Induced Values 模式的示例。
更新:遍历诱导值在 3.2.3 中甚至更好(在撰写本文时尚未发布):
gremlin> g.V(1).outE('test').as('x','y').
where('x',eq('y')).
by('srving_rsrp').by('nbr_rsrp')
==>e[4][1-test->2]
不再讨厌select()
。
在使用 Scala 的过程中,花点时间把上面语句的语法搞懂 Groovy 对了;
这里给别人举个例子
val v0 = graph + "cell_1"
val v2 = graph + "cell_2"
val v3 = graph + "cell_3"
val srving_rsrp = Key[Int]("srving_rsrp")
val nbr_rsrp = Key[Int]("nbr_rsrp")
//v0.addEdge("test",v2,T.id,3,"srving_rsrp",20,"nbr_rsrp",30)
//v0.addEdge("test",v2,T.id,4,"srving_rsrp",30,"nbr_rsrp",30)
//v0.addEdge("test",v2,T.id,5,"srving_rsrp",10,"nbr_rsrp",40)
// create edge with typed properties
v0 ---("test", srving_rsrp → 20, nbr_rsrp → 30) --> v2
v0 ---("test", srving_rsrp → 30, nbr_rsrp → 30) --> v2
v0 ---("test", srving_rsrp → 10, nbr_rsrp → 40) --> v2
//v2.addEdge("test",v3,T.id,6,"srving_rsrp",40,"nbr_rsrp",40)
//v2.addEdge("test",v3,T.id,7,"srving_rsrp",15,"nbr_rsrp",45)
v2 ---("test", srving_rsrp → 40, nbr_rsrp → 40) --> v3
v2 ---("test", srving_rsrp → 15, nbr_rsrp → 45) --> v3
//v3.addEdge("test",v2,T.id,8,"srving_rsrp",15,"nbr_rsrp",15)
v3 ---("test", srving_rsrp → 15, nbr_rsrp → 15) --> v2
val g = graph.traversal()
println(v0.outE("test").value(nbr_rsrp).head)
val r = graph.V.outE.filter { it: Edge =>
(it.property(nbr_rsrp).value() == it.property(srving_rsrp).value())
}
println("value= " + r.count().head()) --> result is 3
这是一个示例图
gremlin> v1 = graph.addVertex(id, 1, label,"cell_1")
gremlin> v2 = graph.addVertex(id, 2, label,"cell_2")
gremlin> v1.addEdge("test",v2,id,3,"srving_rsrp",20,"nbr_rsrp",30)
gremlin> v1.addEdge("test",v2,id,4,"srving_rsrp",30,"nbr_rsrp",30)
gremlin> v1.addEdge("test",v2,id,5,"srving_rsrp",10,"nbr_rsrp",40)
我需要得到 "srving_rsrp" 和 "nbr_rsrp" 值相等的边。我找不到适合它的好例子
这是我到达的地方;而不是每个我都想使用过滤器来创建一个只有符合条件的边缘的图形。我正在使用 Titan (1.0.0-hadoop)
附带的 Germlin shellg.V(1).outE('test').each{ it.property('srving_rsrp').value == it.property('nbr_rsrp').value}
我可以在 Python 中使用 NetworK 轻松完成此操作;这是我想使用 Germlin
实现的代码G = nx.MultiDiGraph() # Create a network Graph
G.add_edge(2,3, time=10,srvingcell=20,neighbourcell=50)
G.add_edge(2,3, time=20,srvingcell=30,neighbourcell=30)
G.add_edge(2,3, time=30,srvingcell=28,neighbourcell=40)
G.add_edge(2,3, time=5,srvingcell=27,neighbourcell=85)
G.edges(data=True)
cutoff = 25
SG=nx.Graph( [ (u,v,d) for u,v,d in G.edges(data=True) if d['srvingcell'] == d['neighbourcell']] )
SG.edges(data=True)
nx.write_gml(SG, "test.gml")
一个简单的答案就是将 each
更改为 filter
:
gremlin> g.V(1).outE('test').filter{ it.get().property('srving_rsrp').value == it.get().property('nbr_rsrp').value}
==>e[4][1-test->2]
但是它使用了 lambda,如果可能的话最好避免使用它们。我不确定以下内容是否适用于 Gremlin 3.0.x(这是 Titan 1.0.0 所基于的),但您可以通过以下方式摆脱 labmda:
gremlin> g.V(1).outE('test').as('x','y').
filter(select('x','y').
by('srving_rsrp').by('nbr_rsrp').
where('x',eq('y')))
==>e[4][1-test->2]
您基本上为边缘提供两个标签 "x" 和 "y",然后应用过滤器。在过滤器中,您 select "x" 和 "y" 标签,对于 "x",您获取 "srving_rsrp" 属性 值,对于 "y" 你获取 "nbr_rsrp" 属性 值并过滤那些 eq
(相等)的值。
这是 TinkerPop 食谱中讨论的 Traversal Induced Values 模式的示例。
更新:遍历诱导值在 3.2.3 中甚至更好(在撰写本文时尚未发布):
gremlin> g.V(1).outE('test').as('x','y').
where('x',eq('y')).
by('srving_rsrp').by('nbr_rsrp')
==>e[4][1-test->2]
不再讨厌select()
。
在使用 Scala 的过程中,花点时间把上面语句的语法搞懂 Groovy 对了;
这里给别人举个例子
val v0 = graph + "cell_1"
val v2 = graph + "cell_2"
val v3 = graph + "cell_3"
val srving_rsrp = Key[Int]("srving_rsrp")
val nbr_rsrp = Key[Int]("nbr_rsrp")
//v0.addEdge("test",v2,T.id,3,"srving_rsrp",20,"nbr_rsrp",30)
//v0.addEdge("test",v2,T.id,4,"srving_rsrp",30,"nbr_rsrp",30)
//v0.addEdge("test",v2,T.id,5,"srving_rsrp",10,"nbr_rsrp",40)
// create edge with typed properties
v0 ---("test", srving_rsrp → 20, nbr_rsrp → 30) --> v2
v0 ---("test", srving_rsrp → 30, nbr_rsrp → 30) --> v2
v0 ---("test", srving_rsrp → 10, nbr_rsrp → 40) --> v2
//v2.addEdge("test",v3,T.id,6,"srving_rsrp",40,"nbr_rsrp",40)
//v2.addEdge("test",v3,T.id,7,"srving_rsrp",15,"nbr_rsrp",45)
v2 ---("test", srving_rsrp → 40, nbr_rsrp → 40) --> v3
v2 ---("test", srving_rsrp → 15, nbr_rsrp → 45) --> v3
//v3.addEdge("test",v2,T.id,8,"srving_rsrp",15,"nbr_rsrp",15)
v3 ---("test", srving_rsrp → 15, nbr_rsrp → 15) --> v2
val g = graph.traversal()
println(v0.outE("test").value(nbr_rsrp).head)
val r = graph.V.outE.filter { it: Edge =>
(it.property(nbr_rsrp).value() == it.property(srving_rsrp).value())
}
println("value= " + r.count().head()) --> result is 3