我想通过比较每个边缘的一个属性来过滤顶点名称(重叠)。
假设我有一个简单的数据集:
A --> 100 --> B
A --> 200 --> C
A --> 100 --> D
参见上文我想基于edge属性(100,200等)显示常见顶点,如:
A 100 B
A 100 D
这是我试过的Gremlin代码:
g.V.outE('give').filter{it.amt.next() == it.amt.next()}
也无法使用has子句输出?它不会返回任何结果。我错过了什么?
答案 0 :(得分:1)
一种方法是使用groupBy操作(@abhi在注释中使用groupCount提出了类似的建议):
gremlin> g = new TinkerGraph()
==>tinkergraph[vertices:0 edges:0]
gremlin> a = g.addVertex("A")
==>v[A]
gremlin> b = g.addVertex("B")
==>v[B]
gremlin> c = g.addVertex("C")
==>v[C]
gremlin> d = g.addVertex("D")
==>v[D]
gremlin> g.addEdge(a, b, 'give', [amt:100])
==>e[0][A-give->B]
gremlin> g.addEdge(a, c, 'give', [amt:200])
==>e[1][A-give->C]
gremlin> g.addEdge(a, d, 'give', [amt:100])
==>e[2][A-give->D]
gremlin> g.V.outE('give').groupBy{it.amt}{[it.outV.next(), it.inV.next()]}.cap.next()
==>100=[[v[A], v[D]], [v[A], v[B]]]
==>200=[[v[A], v[C]]]
要将结果限制为只有具有多个匹配的结果,您可以使用groovy(在本例中使用findAll)处理地图:
gremlin> m=[:];g.V.outE('give').groupBy(m){it.amt}{[it.outV.next(), it.inV.next()]}
==>e[2][A-give->D]
==>e[1][A-give->C]
==>e[0][A-give->B]
gremlin> m
==>100=[[v[A], v[D]], [v[A], v[B]]]
==>200=[[v[A], v[C]]]
gremlin> m.findAll{it.value.size()>1}
==>100=[[v[A], v[D]], [v[A], v[B]]]
答案 1 :(得分:0)
最好用现实世界的例子提出具体问题而不是概括问题。根据我的理解,下面是Cypher表示法。我在Cypher中举了一个例子,我认为你可以转换成Gremlin。如果您不想要它然后发表评论,我将删除此回复。
<强>设置强>
CREATE (A { name: 'A' })-[:GAVE { amount: 100 }]->(B { name: 'B' })
CREATE A-[:GAVE { amount: 200 }]->(C { name: 'C' })
CREATE A-[:GAVE { amount: 100 }]->(D { name: 'D' })
<强>查询强>
返回金额为100的所有节点(顶点)。
MATCH n1-[gave:GAVE]->n2
WHERE gave.amount=100
RETURN n1.name, gave.amount, n2.name
您可以在console here中尝试此操作。
使用真实世界示例更新您的问题,并在neo4j.console.org中更好地设置测试数据,然后通过单击控制台顶部的共享按钮进行共享。