Gremlin Query - повторите с условиями на краях
У меня есть структура грамм гремлинов сети поездов. Вершины - это станции с идентификатором и именем станции в качестве свойств. Края - это трассы с маршрутом, км и последовательностью остановок.
Есть около 840 остановок и 24 маршрута, соединяющих их. Как мы можем себе представить, эти остановки связаны маршрутами, и любые две остановки могут быть связаны более чем одним маршрутом. Также есть циклические маршруты, то есть запуск и остановка на одной и той же остановке. Некоторые остановки являются отправлением и назначением различных маршрутов.
Вопрос, который я пытаюсь задать, состоит в том, как, если данная остановка вышла из строя, как я могу получить затронутые источники и пункты назначения. т.е. получить маршруты, проходящие через него, и получить источник и пункт назначения данных маршрутов.
Кажется, простой вопрос, но я не знаю гремлина, чтобы ответить на него.:)
Пока что нижеприведенный ответ является наиболее близким к моему ответу. Учитывая станцию, маршрут и конечную конечную станцию, я могу получить все станции между ними.
Идеальная ситуация, учитывая станцию, дать все затронутые маршруты, с маршрутом к конечному пункту назначения и маршрутами от источника.
Я не смог соединить вершины на основе свойства ребер. Как соединить вершины на основе маршрута, не давая значения. Кроме того, завершение повтора на листовом узле. т.е. нет дальнейших направлений для подключения. Если бы я мог удалить пока hasID, это было бы победой.:)
g.V().has("id", "17892")
.repeat(outE().has("route","3-96-mjp-1").inV())
.until(hasId("6147"))
.path()
Пример структуры ниже:
g.V().has("id", "17892").outE().path() -->> "objects": [
{
"id": "17892",
"label": "stop",
"type": "vertex",
"properties": {
"stop_id": [
{
"id": "f2eb562e-e362-427c-91ef-02769cfda721",
"value": "17892"
}
],
"stop_name": [
{
"id": "b873d980-8d07-44e7-aa45-5be1afad4a63",
"value": "10-Albert St/Nicholson St (East Melbourne)"
}
]
}
},
{
"id": "242fa97f-134d-439a-b8ab-0b4d8b8da9bc",
"label": "nextStop",
"type": "edge",
"inVLabel": "stop",
"outVLabel": "stop",
"inV": "17893",
"outV": "17892",
"properties": {
"distance": 125,
"route": "3-35-mjp-1",
"stopSeq": 17
}
}
]
Я делаю это в Azure CosmosDB Graph.
1 ответ
Без примера графика я просто пытаюсь сделать правильное предположение:
g.V().has("id", "17892").
bothE("nextStop").as("e").outV().
until(__.not(inE("nextStop").
where(eq("e")).by("route").
where(lt("e")).by("stopSeq"))).
repeat(inE("nextStop").
where(eq("e")).by("route").
where(lt("e")).by("stopSeq").as("e").outV()).as("origin").
outE("nextStop").as("e").inV().
until(__.not(outE("nextStop").
where(eq("e")).by("route").
where(gt("e")).by("stopSeq"))).
repeat(outE("nextStop").
where(eq("e")).by("route").
where(gt("e")).by("stopSeq").as("e").inV()).
path().
from("origin").
by("stop_id").
by("distance")
Предполагается, что этот обход должен найти все источники и оттуда пройти до конечного пункта назначения и испустить эти пути.