2014-10-11 4 views
2

У меня есть следующий простой график временных сопоставлений IP-> FQDN со временем.Titan: Gremlin или Java для эффективных запросов времени на основе графика

enter image description here

Я создал этот график следующим

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).

Мои вопросы в настоящее время следующие.

  1. Как я могу изменить этот гном запрос вернуться не только вершину , но и края, которые ведут к нему.

  2. Является ли этот запрос оптимальным с учетом индексов, которые я создал? Если я правильно понимаю индекс bindByTime, этот запрос должен быть таким же эффективным (взять одно и то же время вычисления), даже если граф, изображенный выше, содержит, например, миллион краев привязки (t1, t2, ... t1000000) исходящих из каждого ip (ip1, ф2).

  3. Как выполнить этот запрос из 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(); 

ответ

1

Ответ на вопрос Q1, кажется, использует комбинацию как и выберите.

g.V.has('name', 'ip1').outE.has('timestamp', LESS_THAN_EQUAL, 3).order().last().as('e').inV().as('v').select(['e', 'v']) 

Ответ на Q2, кажется, да, если я использую OrderBy() см quote from the Titan 0.5 docs ниже.

Смешанные индексы поддерживают заказ изначально и эффективно. Тем не менее, ключ свойства , используемый в методе orderBy, должен был быть ранее , добавлен в смешанную индексированную для поддержки поддержки нативного результата. Это значение важно в тех случаях, когда ключ orderBy отличается от ключа . Если ключ свойства не является частью индекса, сортировка требует загрузки всех результатов в память.

Однако я не могу использовать OrderBy()

g.V.has('name', 'ip1').outE.has('timestamp', LESS_THAN_EQUAL, 3).orderBy('timestamp', Order.DESC).last().as('e').inV().as('v').select(['e', 'v']) 

Я получаю следующее исключение

Нет подписи метода: com.tinkerpop.gremlin.groovy.GremlinGroovyPipeline.orderBy() - , применимый для типов аргументов: (java.lang.String, com.thinkaurelius.titan.core.Order) значения: [timestamp, DESC] Возможные решения : заказ(), заказ (com.tinkerpop.gremlin.Tokens $ T), заказ (com.tinkerpop.pipes.PipeFunction), заказ (com.tinkerpop.pipes.transform.TransformPipe $ Order), заказ (groovy. lang.Closure), каждый()

Ответ на вопрос Q3, похоже, не на самом деле. Ничто на следующей странице не похоже на PreparedStatement, которое очень читаемо и защищает от запроса.

https://github.com/tinkerpop/gremlin/wiki/Using-Gremlin-through-Java