【问题标题】:Query to find node which has only one vertex in common查询以查找只有一个公共顶点的节点
【发布时间】:2021-06-27 17:15:38
【问题描述】:
我有以下顶点 -
Person1 -> Device1 <- Person2
^
| |
v
Email1 <- Person3
现在我想编写一个 gremlin 查询(janusgraph),它将为我提供所有连接到 person1 所连接设备的人(仅)。
所以根据上图,我们的输出应该是-[Person2]。
Person3 不在输出中,因为 Person3 还与“Person1”的“Email1”连接。
【问题讨论】:
标签:
graph
gremlin
graph-databases
janusgraph
tinkerpop3
【解决方案1】:
g.addV('person').property('name', 'Person1').as('p1').
addV('person').property('name', 'Person2').as('p2').
addV('person').property('name', 'Person3').as('p3').
addV('device').as('d1').
addV('email').as('e1').
addE('HAS_DEVICE').from('p1').to('d1').
addE('HAS_EMAIL').from('p1').to('e1').
addE('HAS_DEVICE').from('p2').to('d1').
addE('HAS_DEVICE').from('p3').to('d1').
addE('HAS_EMAIL').from('p3').to('e1')
以下遍历将为您提供通过一个或多个“设备”顶点连接到“Person1”而不通过任何其他类型顶点连接的人员顶点。在此处输入代码
g.V().has('person', 'name', 'Person1').as('p1').
out().as('connector').
in().where(neq('p1')).
group().
by().
by(select('connector').label().fold()).
unfold().
where(
select(values).
unfold().dedup().fold(). // just in case the persons are connected by multiple devices
is(eq(['device']))
).
select(keys)