如何在Gremlin中缩短where语句?
我想知道在找到第一个结果时是否可能短路where语句 以下是一个示例查询:如何在Gremlin中缩短where语句?,gremlin,graph-databases,amazon-neptune,Gremlin,Graph Databases,Amazon Neptune,我想知道在找到第一个结果时是否可能短路where语句 以下是一个示例查询: g.V().hasLabel('SEAT') where( __.repeat(out('NEXT').simplePath()) .until(loops().is(gte(2))) ) .in('CONTAINS') .dedup() 重复数据消除是必需的,因为给定顶点的多个长度可能在“包含”的内边缘上有一个父节点,而“下一个”的外边缘上有多个顶点链
g.V().hasLabel('SEAT')
where(
__.repeat(out('NEXT').simplePath())
.until(loops().is(gte(2)))
)
.in('CONTAINS')
.dedup()
重复数据消除是必需的,因为给定顶点的多个长度可能在“包含”的内边缘上有一个父节点,而“下一个”的外边缘上有多个顶点链
我想要的是,在第一次找到满足条件的顶点时,短路where
下面是一个示例图和查询:
关于这一问题的进一步澄清:
如果我将查询更改为使用路径
而不是重复数据消除
,结果如下:
[
[
{
"id": 15245,
"label": "SEAT"
},
{
"id": 15239,
"label": "SECTION"
}
],
[
{
"id": 15248,
"label": "SEAT"
},
{
"id": 15239,
"label": "SECTION"
}
],
[
{
"id": 15257,
"label": "SEAT"
},
{
"id": 15242,
"label": "SECTION"
}
],
[
{
"id": 15260,
"label": "SEAT"
},
{
"id": 15242,
"label": "SECTION"
}
],
[
{
"id": 15263,
"label": "SEAT"
},
{
"id": 15242,
"label": "SECTION"
}
]
]
您可以注意到,对于满足where条件的每个路径(即,具有相同截面顶点的多个结果),都有一个结果(子顶点开始+父顶点)。我希望查询在找到满足where子句的第一条路径后停止处理
基本上,我希望找到每个“截面”顶点,其中在其子顶点上有长度为N或更大的路径
我正在寻找的结果(使用path
)如下所示:
[
[
{
"id": 15245,
"label": "SEAT"
},
{
"id": 15239,
"label": "SECTION"
}
]
[
{
"id": 15257,
"label": "SEAT"
},
{
"id": 15242,
"label": "SECTION"
}
]
]
我基本上是在寻找类似于
whereFirst
(如果它确实存在)的东西。您可以按如下方式重写查询,以过滤where中的重复项
g.V().hasLabel('SEAT').
where(
__.repeat(out('NEXT').simplePath().where(without('x')).store('x'))
.until(loops().is(gte(2)))
)
.in('CONTAINS')
如果在查询的末尾放置
路径
步骤,而不是重复数据消除
,您应该看到,对于每个起始顶点,搜索将在找到一个结果后立即结束。这不是你看到的吗?我尝试了使用您的数据,只看到了每个开始的一个结果(正如您所指出的,可能会有重复的结果),我希望查询在找到满足每个父节点的where条件的单个子顶点链后短路。我不想知道每一条路,我只想知道至少有一条路。例如,使用我的示例,使用path
我将获得多个截面ID 15239的结果,我希望它在找到满足where条件的顶点子链后,对每个截面顶点短路。好的,谢谢这有助于澄清。您希望不必执行重复数据消除。