У меня есть следующий график:
Я использую Tinkergraph, чтобы попытаться выяснить:
- Имеет ли Пользователь # 1 разрешение на "чтение" на Ресурс # 1 ?(нет)
- Имеет ли Пользователь # 2 разрешение на "запись" на Ресурс # 1 ?(да).
Я также пытаюсь найти запрос, не относящийся к этому точному графику, поскольку в реальной модели между ними может быть несколько иерархических ролей.Я только начинаю разбираться с синтаксисом Gremlin, но этот конкретный запрос я считаю неуловимым.Вот код, который создает приведенный выше график:
Graph graph = TinkerGraph.open();
Vertex user1 = graph.addVertex(T.label, "user", T.id, 1, "name", "marko");
Vertex user2 = graph.addVertex(T.label, "user", T.id, 2, "name", "vadas");
Vertex role1 = graph.addVertex(T.label, "role", T.id, 3, "name", "role_1");
Vertex role2 = graph.addVertex(T.label, "role", T.id, 4, "name", "role_2");
Vertex resource1 = graph.addVertex(T.label, "resource", T.id, 5, "name", "resource_1");
Vertex resource2 = graph.addVertex(T.label, "resource", T.id, 6, "name", "resource_2");
user1.addEdge("read", resource2, T.id, 7);
user1.addEdge("member", role2, T.id, 8);
user2.addEdge("owns", resource2, T.id, 9);
user2.addEdge("member", role1, T.id, 10);
role1.addEdge("child_of", role2, T.id, 11);
role1.addEdge("read", resource1, T.id, 12);
role2.addEdge("write", resource1, T.id, 13);
role2.addEdge("write", resource2, T.id, 14);
Моя текущая попытка ответить на вопрос # 1 заключалась в использовании repeat
, начиная с User # 1 и следуя по пути донашел "outEdge" с меткой "read", ведущей к вершине Resource # 1 .
Аааа, когда я пишу это, я, возможно, только что понял, но, как я довольноновичок в Гремлин, может быть, кто-то, кто хорошо знает Гремлин, может здраво проверить это или сказать мне, есть ли лучший способ сделать это?А если нет, то, возможно, это поможет кому-то еще, кто пытается решить ту же проблему.
q1 = graph.traversal().V(user1.id())
.repeat(__.out().simplePath())
.until(__.outE().hasLabel("read").inV().is(resource1)).path().toList();
// q1 returns [] (which is expected)
q2 = graph.traversal().V(user2.id())
.repeat(__.out().simplePath())
.until(__.outE().hasLabel("write").inV().is(resource1)).path().toList();
// q2 returns [[v[2], v[3], v[4]]] (which seems right too)