blob: f312117af9cb6ae8de21d565bfcf3b10d9bdfcc6 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.atlas.repository.graphdb;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Set;
import javax.script.Bindings;
import javax.script.ScriptException;
/**
* Represents a graph
*
* @param <V> vertex implementation class
* @param <E> edge implementation class
*/
public interface AtlasGraph<V,E> {
/**
* Adds an edge to the graph
*
* @param outVertex
* @param inVertex
* @param label
* @return
*/
AtlasEdge<V,E> addEdge(AtlasVertex<V,E> outVertex, AtlasVertex<V,E> inVertex, String label);
/**
* Adds a vertex to the graph
*
* @return
*/
AtlasVertex<V,E> addVertex();
/**
* Removes the specified edge from the graph
*
* @param edge
*/
void removeEdge(AtlasEdge<V,E> edge);
/**
* Removes the specified vertex from the graph.
*
* @param vertex
*/
void removeVertex(AtlasVertex<V,E> vertex);
/**
* Retrieves the edge with the specified id
* @param edgeId
* @return
*/
AtlasEdge<V,E> getEdge(String edgeId);
/**
* Gets all the edges in the graph.
* @return
*/
Iterable<AtlasEdge<V,E>> getEdges();
/**
* Gets all the vertices in the graph.
* @return
*/
Iterable<AtlasVertex<V,E>> getVertices();
/**
* Gets the vertex with the specified id
*
* @param vertexId
* @return
*/
AtlasVertex<V, E> getVertex(String vertexId);
/**
* Gets the names of the indexes on edges
* type.
*
* @param type
* @return
*/
Set<String> getEdgeIndexKeys();
/**
* Gets the names of the indexes on vertices.
* type.
*
* @param type
* @return
*/
Set<String> getVertexIndexKeys();
/**
* Finds the vertices where the given property key
* has the specified value. For multi-valued properties,
* finds the vertices where the value list contains
* the specified value.
*
* @param key
* @param value
* @return
*/
Iterable<AtlasVertex<V,E>> getVertices(String key, Object value);
/**
* Creates a graph query
* @return
*/
AtlasGraphQuery<V,E> query();
/**
* Creates an index query
*
* @param indexName index name
* @param queryString the query
*
* @see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html">Elastic Search Reference</a> for query syntax
*/
AtlasIndexQuery<V,E> indexQuery(String indexName, String queryString);
/**
* Gets the management object associated with this graph and opens a transaction
* for changes that are made.
* @return
*/
AtlasGraphManagement getManagementSystem();
/**
* Commits changes made to the graph in the current transaction.
*/
void commit();
/**
* Rolls back changes made to the graph in the current transaction.
*/
void rollback();
/**
* Unloads and releases any resources associated with the graph.
*/
void shutdown();
/**
* deletes everything in the graph. For testing only
*/
void clear();
/**
* Converts the graph to gson and writes it to the specified stream
*
* @param os
* @throws IOException
*/
void exportToGson(OutputStream os) throws IOException;
//the following methods insulate Atlas from the details
//of the interaction with Gremlin
/**
*
* When we construct Gremlin select queries, the information we request
* is grouped by the vertex the information is coming from. Each vertex
* is assigned a column name which uniquely identifies it. The queries
* are specially formatted so that the value associated with each of
* these column names is an array with the various things we need
* about that particular vertex. The query evaluator creates a mapping
* that knows what index each bit of information is stored at within
* this array.
* <p/>
* When we execute a Gremlin query, the exact java objects we get
* back vary depending on whether Gremlin 2 or Gremlin 3 is being used.
* This method takes as input a raw row result that was obtained by
* executing a Gremlin query and extracts the value that was found
* at the given index in the array for the given column name.
* <p/>
* If the value found is a vertex or edge, it is automatically converted
* to an AtlasVertex/AtlasEdge.
*
* @param rowValue the raw row value that was returned by Gremin
* @param colName the column name to use
* @param idx the index of the value within the column to retrieve.
*
*/
Object getGremlinColumnValue(Object rowValue, String colName, int idx);
/**
* When Gremlin queries are executed, they return
* Vertex and Edge objects that are specific to the underlying
* graph database. This method provides a way to convert these
* objects back into the AtlasVertex/AtlasEdge objects that
* Atlas requires.
*
* @param rawValue the value that was obtained from Gremlin
* @return either an AtlasEdge, an AtlasVertex, or the original
* value depending on whether the rawValue represents an edge,
* vertex, or something else.
*
*/
Object convertGremlinValue(Object rawValue);
/**
* Gremlin 2 and Gremlin 3 represent the results of "path"
* queries differently. This method takes as input the
* path from Gremlin and returns the list of objects in the path.
*
* @param rawValue
* @return
*/
List<Object> convertPathQueryResultToList(Object rawValue);
/**
* Gets the version of Gremlin that this graph uses.
*
* @return
*/
GremlinVersion getSupportedGremlinVersion();
/**
* Executes a gremlin query, returns an object with the raw
* result.
*
* @param gremlinQuery
* @return
*/
Object executeGremlinScript(String gremlinQuery) throws ScriptException;
}