图数据库:使用 Gremlin 检索最复杂的关系

问题描述 投票:0回答:1

我正在尝试编写一个 Gremlin 查询来查找遍历的顶点和边(及其属性)的列表,返回基于起始顶点的最复杂(即最高计数)的顶点。

换句话说,我想检索代码最多的患者,但Patients和Codes之间没有直接关系。这是关系和方向:

Patient->Diagnosis<-Code

这是我的尝试:

g.V().hasLabel('Patient'). 
  outE().inV().
  inE().outV().
  path().
    by(elementMap()).
  order().
    by(count(local), asc).
  tail(2).
  unfold().
  toList()

我希望这会返回带有遍历边/顶点的患者顶点,根据每个患者返回的代码数,仅返回前 2 个。这就是我得到的:

single patient vertex with traversed edges/nodes

这里是复制相同关系的样本插入:

g
.addV('pat').property(id, 'p-0')
.addV('pat').property(id, 'p-1')
.addV('pat').property(id, 'p-2')
.addV('diag').property(id, 'd-0')
.addV('diag').property(id, 'd-1')
.addV('diag').property(id, 'd-2')
.addV('code').property(id, 'c-0')
.addV('code').property(id, 'c-1')
.V('p-0').addE('contracted').to(V('d-0'))
.V('p-0').addE('contracted').to(V('d-1'))
.V('p-0').addE('contracted').to(V('d-2'))
.V('p-1').addE('contracted').to(V('d-1'))
.V('p-2').addE('contracted').to(V('d-2'))
.V('c-0').addE('includes').to(V('d-0'))
.V('c-1').addE('includes').to(V('d-0'))
.V('c-1').addE('includes').to(V('d-1'))
.V('c-2').addE('includes').to(V('d-1'))

这是我想返回的格式示例: 我在顶点和边缘步骤之后使用了“.path().by(elementMap()).unfold().toList()”来得到这个。

我希望输出是生成如下图的顶点和边:

如您所见,在三个患者中,我想返回前 2 个最复杂的患者(基于他们的诊断代码的数量)。我不想只用一个代码就把病人还回去。

gremlin graph-databases graph-notebook
1个回答
0
投票

感谢您提供示例图。这真的很有帮助。使用此查询有助于直观地查看图表。

g.V().hasLabel('pat').
  outE().inV().
  inE().outV().
  simplePath().
  path().by(elementMap())

使用图形笔记本,产生:

要找到每个起始患者的代码数,我们可能会这样做。它建立在先前的查询之上,但使用边缘标签进行过滤。

g.V().hasLabel('pat').as('p').
  out('contracted').
  group().
    by(select('p').id()).
    by(in('includes').count())

这将为我们提供与每个患者相关的代码

{'p-0': 3, 'p-2': 0, 'p-1': 1}

但是,您可能不希望这种代码被多个诊断共享的重复计算。在那种情况下,我们可以

dedup
结果。

g.V().hasLabel('pat').as('p').
  out('contracted').
  group().
    by(select('p').id()).
    by(in('includes').dedup().count())

将 p-0 的计数减少到 2 并完全删除 p-2,因为没有代码。

{'p-0': 2, 'p-1': 1}

已更新

根据评论中的附加讨论,此查询可以使用

groupCount
结果作为过滤器。

g.V().hasLabel('pat').as('p').
  outE('contracted').inV().
  where(
    group().
      by(select('p').id()).
      by(in('includes').dedup().count()).
    select(values).unfold().is(2)).
    inE().outV().
    path().by(elementMap())

视觉呈现时

© www.soinside.com 2019 - 2024. All rights reserved.