【问题标题】:How do I select edges properties where the vertices share a common property?如何选择顶点共享公共属性的边属性?
【发布时间】:2013-09-18 15:12:02
【问题描述】:

我想通过比较每条边的一个属性来过滤顶点名称(重叠)。

假设我有一个简单的数据集:

A  --> 100  --> B
A  --> 200  --> C
A  --> 100  --> D

见上文,我想显示基于边缘属性(100、200 等)的常见顶点,例如:

A 100 B
A 100 D

这是我试过的 Gremlin 代码:

g.V.outE('give').filter{it.amt.next() == it.amt.next()}

使用 has 子句也无法输出?它不返回任何结果。我错过了什么?

【问题讨论】:

  • 可以是 groupCount(amt) 然后如果它是 > 1 那么那些具有共同边缘属性的重复顶点,即 amt 。

标签: groovy neo4j gremlin


【解决方案1】:

一种方法是使用 groupBy 操作(@abhi 在 cmets 中提出了类似的建议来使用 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 行。像 {it.inV.next().count().size() > 1..
【解决方案2】:

用现实世界的例子提出具体问题总是比概括问题要好。根据我的理解,以下是 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 中更好地设置测试数据,然后通过单击控制台顶部的 分享 按钮进行分享。

【讨论】:

  • 谢谢 :) 由于敏感数据..我发送了一个粗略的例子。会听从你的建议。
最近更新 更多