如果我有一个看起来像这样的图表:
N3->member_of->N1
N2->knows->N1
N3->likes->N2
N4->member_of->N1
N5->likes->N2
有没有一种方法可以执行以下操作:
- 如果从 N3 开始将返回 N2
- 在 N4 开始的相同查询将返回 N2
- 在 N5 开始的相同查询将返回 N2
(最好在 gremlin 中)
编辑:澄清:只要一级关系是“member_of”,我最多可以进行二级连接。
如果我有一个看起来像这样的图表:
N3->member_of->N1
N2->knows->N1
N3->likes->N2
N4->member_of->N1
N5->likes->N2
有没有一种方法可以执行以下操作:
(最好在 gremlin 中)
编辑:澄清:只要一级关系是“member_of”,我最多可以进行二级连接。
很老的问题,但由于没有人想出 Gremlin 解决方案,这里是:
我拿了 Bobbys 的初始化脚本:
g = new TinkerGraph()
(1..5).each { g.addVertex(it) }
g.addEdge(g.v(3), g.v(1), "member_of")
g.addEdge(g.v(2), g.v(1), "knows")
g.addEdge(g.v(3), g.v(2), "likes")
g.addEdge(g.v(5), g.v(2), "likes")
g.addEdge(g.v(4), g.v(1), "member_of")
这是您的 Gremlin 查询:
gremlin> g.v(3).copySplit(_().out('likes'), _().out('member_of').loop('start'){true}{true}.in('knows')).exhaustMerge().dedup()
==>v[2]
gremlin> g.v(4).copySplit(_().out('likes'), _().out('member_of').loop('start'){true}{true}.in('knows')).exhaustMerge().dedup()
==>v[2]
gremlin> g.v(5).copySplit(_().out('likes'), _().out('member_of').loop('start'){true}{true}.in('knows')).exhaustMerge().dedup()
==>v[2]
干杯,丹尼尔
您是否想要返回一个节点(人?)的所有传入和传出关系,以及一个人所属的任何组的所有相关节点?那么“团体”通过“成员”来交换他们的关系?
如果是这样,并且假设不允许使用递归组,我提出了一个替代图表,可以更清楚地说明您的用例(据我所知)-> http://console.neo4j.org/?id= wyr207
如果你跑
start n=node(5) match n-[?:knows|likes]-related, n-[?:member_of]->group-[:knows|likes]-other_related return related, other_related
在图上,related
将返回所有直接相关的节点,以及other_related
从组返回的所有其他节点(如果该节点是组的成员)。将这些结合起来超出了我的 Cypher 能力,但它们将被重复删除 AFAIK(其中不related
包含任何节点other_related
)。
尝试在控制台链接中使用几个不同的节点 ID(N5 的节点 ID 为 1)进行查询,看看这是否是您的想法。添加关系方向等会很简单。
将其翻译为 Gremlin有点乏味(Cypher 中的模式匹配更自然),但如果方向正确,我会做 LMK。
不确定您的设置是否正确,尝试在这里进行:http: //tinyurl.com/d2mjkj2 - 设置正确吗?
如果需要第一个关系类型,member_of
则 N5 不应返回 N2。否则,您可以执行类似的操作
start s=node(3,4,5) match s-[r1:member_of]->()<-[r2*0..1]-end return s,end
返回以member_of
关系开头的模式,然后具有 0 或 1 个任何类型的关系。如果需要,请收紧,有关详细信息,请参阅http://docs.neo4j.org/chunked/snapshot/query-match.html#match-variable-length-relationships。
这就是它在密码中的样子:
1: start n=node(3) match n-[:LIKES]->m return m;
2: start n=node(4) match n-[:MEMBER_OF]-m-[]-k return k; (will return n2,n3. if you want n2 only match n-[:MEMBER_OF]-m-[:KNOWS]-k )
3: the same as 1)
首先使用TinkerGraph在Gremlin Groovy shell中创建图形:
g = new TinkerGraph()
(1..5).each { g.addVertex(it) }
g.addEdge(g.v(3), g.v(1), "member_of")
g.addEdge(g.v(2), g.v(1), "knows")
g.addEdge(g.v(3), g.v(2), "likes")
g.addEdge(g.v(5), g.v(2), "likes")
g.addEdge(g.v(4), g.v(1), "member_of")
听起来您想要一个从顶点 3、4 或 5 开始并返回顶点 2 的查询。下面的查询使用该算法:
gremlin> g.v(3).both.loop(1) {it.loops < 3}{it.object.id == "2"}.next()
==>v[2]
gremlin> g.v(4).both.loop(1) {it.loops < 3}{it.object.id == "2"}.next()
==>v[2]
gremlin> g.v(5).both.loop(1) {it.loops < 3}{it.object.id == "2"}.next()
==>v[2]
您可能还会发现有关路径模式的 Gremlin 文档很有用。