如何在 Gremlin 中短路 where 语句?
How to short-circuit a where statement in Gremlin?
我想知道是否可以在找到第一个结果时短路 where 语句。
这是一个示例查询:
g.V().hasLabel('SEAT')
where(
__.repeat(out('NEXT').simplePath())
.until(loops().is(gte(2)))
)
.in('CONTAINS')
.dedup()
重复数据删除是必需的,因为给定顶点可能有多个长度,这些顶点在 'CONTAINS' 的入边上有父节点,在 'NEXT' 的出边上有顶点链.
我想要的是在找到第一次满足条件的顶点时短路 where。
这是一个示例图和查询:https://gremlify.com/bwa7spaz97b/5
关于此问题的更多说明:
如果我将查询更改为使用 path
而不是 dedup
,结果如下:
[
[
{
"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条件的每条路径(即具有相同SECTION顶点的多个结果),都有一个结果(子顶点开始+父顶点)。我希望查询在找到满足 where 子句的第一条路径后停止处理。
从根本上说,我想找到每个 'SECTION' 顶点,其中在其子顶点上存在长度为 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 语句。
这是一个示例查询:
g.V().hasLabel('SEAT')
where(
__.repeat(out('NEXT').simplePath())
.until(loops().is(gte(2)))
)
.in('CONTAINS')
.dedup()
重复数据删除是必需的,因为给定顶点可能有多个长度,这些顶点在 'CONTAINS' 的入边上有父节点,在 'NEXT' 的出边上有顶点链.
我想要的是在找到第一次满足条件的顶点时短路 where。
这是一个示例图和查询:https://gremlify.com/bwa7spaz97b/5
关于此问题的更多说明:
如果我将查询更改为使用 path
而不是 dedup
,结果如下:
[
[
{
"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条件的每条路径(即具有相同SECTION顶点的多个结果),都有一个结果(子顶点开始+父顶点)。我希望查询在找到满足 where 子句的第一条路径后停止处理。
从根本上说,我想找到每个 'SECTION' 顶点,其中在其子顶点上存在长度为 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')