Gremlin 选择性遍历
Gremlin selective traversal
这可能是菜鸟 Gremlin 的问题:
假设我有这张图
A [知道--->] B
A [知道--->] C
D [知道--->] C
我想遍历这个图并找到只有 A 知道的节点,在这种情况下是 B 而不是 C,因为 A 和 D 都知道 C。有没有办法用 Gremlin 做到这一点?
编辑:
抱歉,我最初应该在问题中更明确
传入边的数量实际上可以是可变的。
g.addV('A').as('a')
.addV('B').as('b')
.addV('C').as('c')
.addV('D').as('d')
.addV('E').as('e')
.addV('F')as('f')
.addE('knows').from('a').to('c')
.addE('knows').from('b').to('c')
.addE('knows').from('a').to('f')
.addE('knows').from('b').to('f')
.addE('knows').from('d').to('f')
在这种情况下,我只想要 C 而不是 F,因为 A 和 B 都知道 C 和 F,但 D 也知道 F,所以我不需要 F。
有一个小样本图会很有帮助。这是符合您问题的一个。
g.addV('A').as('a').
addV('B').as('b').
addV('C').as('c').
addV('D').as('d').
addE('knows').from('a').to('b').
addE('knows').from('a').to('c').
addE('knows').from('d').to('c')
使用该图查找 A 独有的朋友的查询可以写成
gremlin> g.V().hasLabel('A').
out('knows').
filter(__.in('knows').count().is(1)).
path().
by(label)
==>[A,B]
根据更新的问题进行编辑。
好的,考虑到额外的标准,我相信这可以满足您的需求
gremlin> g.V().hasLabel('A','B').
......1> out().
......2> groupCount().
......3> unfold().
......4> filter(select(values).is(2)).
......5> select(keys).
......6> where(__.in('knows').count().is(2)).
......7> label()
==>C
这可能是菜鸟 Gremlin 的问题:
假设我有这张图
A [知道--->] B
A [知道--->] C
D [知道--->] C
我想遍历这个图并找到只有 A 知道的节点,在这种情况下是 B 而不是 C,因为 A 和 D 都知道 C。有没有办法用 Gremlin 做到这一点?
编辑: 抱歉,我最初应该在问题中更明确 传入边的数量实际上可以是可变的。
g.addV('A').as('a')
.addV('B').as('b')
.addV('C').as('c')
.addV('D').as('d')
.addV('E').as('e')
.addV('F')as('f')
.addE('knows').from('a').to('c')
.addE('knows').from('b').to('c')
.addE('knows').from('a').to('f')
.addE('knows').from('b').to('f')
.addE('knows').from('d').to('f')
在这种情况下,我只想要 C 而不是 F,因为 A 和 B 都知道 C 和 F,但 D 也知道 F,所以我不需要 F。
有一个小样本图会很有帮助。这是符合您问题的一个。
g.addV('A').as('a').
addV('B').as('b').
addV('C').as('c').
addV('D').as('d').
addE('knows').from('a').to('b').
addE('knows').from('a').to('c').
addE('knows').from('d').to('c')
使用该图查找 A 独有的朋友的查询可以写成
gremlin> g.V().hasLabel('A').
out('knows').
filter(__.in('knows').count().is(1)).
path().
by(label)
==>[A,B]
根据更新的问题进行编辑。
好的,考虑到额外的标准,我相信这可以满足您的需求
gremlin> g.V().hasLabel('A','B').
......1> out().
......2> groupCount().
......3> unfold().
......4> filter(select(values).is(2)).
......5> select(keys).
......6> where(__.in('knows').count().is(2)).
......7> label()
==>C