У меня есть следующий простой график временных сопоставлений IP-> FQDN со временем.Titan: Gremlin или Java для эффективных запросов времени на основе графика
Я создал этот график следующим
TitanManagement mgmt = graph.getManagementSystem();
VertexLabel ip = mgmt.makeVertexLabel("ip").make();
VertexLabel fqdn = mgmt.makeVertexLabel("fqdn").make();
EdgeLabel bind = mgmt.makeEdgeLabel("bind").make();
final PropertyKey name = mgmt.makePropertyKey("name").dataType(String.class).make();
TitanGraphIndex namei = mgmt.buildIndex("name", Vertex.class).addKey(name).unique().buildCompositeIndex();
mgmt.setConsistency(namei, ConsistencyModifier.LOCK);
final PropertyKey timestamp = mgmt.makePropertyKey("timestamp").dataType(Integer.class).make();
mgmt.buildEdgeIndex(bind, "bindByTime", Direction.BOTH, Order.DESC, timestamp);
mgmt.commit();
TitanTransaction tx = graph.newTransaction();
Vertex ip1 = tx.addVertexWithLabel("ip");
ip1.setProperty("name", "ip1");
Vertex ip2 = tx.addVertexWithLabel("ip");
ip2.setProperty("name", "ip2");
Vertex fqdn1 = tx.addVertexWithLabel("fqdn");
fqdn1.setProperty("name", "fqdn1");
Vertex fqdn2 = tx.addVertexWithLabel("fqdn");
fqdn2.setProperty("name", "fqdn2");
ip1.addEdge("bind", fqdn1).setProperty("timestamp", 1);
ip2.addEdge("bind", fqdn2).setProperty("timestamp", 2);
ip1.addEdge("bind", fqdn2).setProperty("timestamp", 3);
tx.commit();
сейчас я нахожусь в процессе написания запроса, который находит полное доменное имя, IP-был обязан в определенный момент времени. Ниже приводятся некоторые примеры
- fqdnFor (Ip = "IP1", метка времени = 1) == fqdn1
- fqdnFor (ф = "IP1", временная метка = 2) == fqdn1
- fqdnFor (ф =» ip1" , метка времени = 3) == fqdn2
- fqdnFor (ф = "ip1", метка времени = 4) == fqdn2
Вот гном запрос я написал, чтобы вычислить это, я считаю, что это исправить, например, (ip = 'ip1', t = 4).
Мои вопросы в настоящее время следующие.
Как я могу изменить этот гном запрос вернуться не только вершину , но и края, которые ведут к нему.
Является ли этот запрос оптимальным с учетом индексов, которые я создал? Если я правильно понимаю индекс bindByTime, этот запрос должен быть таким же эффективным (взять одно и то же время вычисления), даже если граф, изображенный выше, содержит, например, миллион краев привязки (t1, t2, ... t1000000) исходящих из каждого ip (ip1, ф2).
Как выполнить этот запрос из java вместо консоли gremlin? Я надеялся найти что-то похожее на JDBC PreparedStatement.
Что-то вроде следующего судового кода.
PreparedGremlinQuery query = new PreparedGremlinQuery("V.has('name', :ip).outE.has('timestamp', LESS_THAN_EQUAL, :t).order().last().inV()");
query.put(1, "ip1");
query.put(2, 3);
Result r = query.execute();