我正在尝试编写一个 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 个。这就是我得到的:
这里是复制相同关系的样本插入:
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 个最复杂的患者(基于他们的诊断代码的数量)。我不想只用一个代码就把病人还回去。
感谢您提供示例图。这真的很有帮助。使用此查询有助于直观地查看图表。
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())
视觉呈现时