2

如果我有一个看起来像这样的图表:

N3->member_of->N1
N2->knows->N1
N3->likes->N2
N4->member_of->N1
N5->likes->N2

有没有一种方法可以执行以下操作:

  1. 如果从 N3 开始将返回 N2
  2. 在 N4 开始的相同查询将返回 N2
  3. 在 N5 开始的相同查询将返回 N2

(最好在 gremlin 中)

编辑:澄清:只要一级关系是“member_of”,我最多可以进行二级连接。

4

5 回答 5

3

很老的问题,但由于没有人想出 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]

干杯,丹尼尔

于 2013-07-12T09:40:56.960 回答
0

您是否想要返回一个节点(人?)的所有传入和传出关系,以及一个人所属的任何组的所有相关节点?那么“团体”通过“成员”来交换他们的关系?

如果是这样,并且假设不允许使用递归组,我提出了一个替代图表,可以更清楚地说明您的用例(据我所知)-> 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。

于 2012-08-10T22:00:20.703 回答
0

不确定您的设置是否正确,尝试在这里进行: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

于 2012-07-25T07:50:19.307 回答
0

这就是它在密码中的样子:

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)
于 2012-07-24T09:01:25.697 回答
0

首先使用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 的查询。下面的查询使用该算法:

  • 获取顶点'x'
  • 获取传入和传出的相邻顶点
  • 再次循环,直到我们循环 3 次或找到一个 id 为“2”的顶点
  • 通过获取管道的 next() 成员重复数据删除结果
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 文档很有用。

于 2012-07-25T21:01:15.843 回答