You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by sa...@apache.org on 2018/01/28 23:47:53 UTC

atlas git commit: ATLAS-2420: Create indexes for relationship attributes

Repository: atlas
Updated Branches:
  refs/heads/master d7ac76c48 -> 37b271072


ATLAS-2420: Create indexes for relationship attributes


Project: http://git-wip-us.apache.org/repos/asf/atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/37b27107
Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/37b27107
Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/37b27107

Branch: refs/heads/master
Commit: 37b2710725e8744e1af4cfcab33cdd1dd448b67d
Parents: d7ac76c
Author: Sarath Subramanian <ss...@hortonworks.com>
Authored: Sun Jan 28 15:45:52 2018 -0800
Committer: Sarath Subramanian <ss...@hortonworks.com>
Committed: Sun Jan 28 15:45:52 2018 -0800

----------------------------------------------------------------------
 .../org/apache/atlas/repository/Constants.java  |   2 +
 .../graphdb/AtlasGraphManagement.java           |  46 ++-
 .../janus/AtlasJanusGraphManagement.java        | 106 +++---
 .../janus/AbstractGraphDatabaseTest.java        |   7 +-
 .../graphdb/janus/AtlasJanusDatabaseTest.java   |   5 +-
 .../graphdb/titan0/Titan0GraphManagement.java   |  41 ++-
 .../titan0/AbstractGraphDatabaseTest.java       |   7 +-
 .../graphdb/titan0/Titan0DatabaseTest.java      |   2 +-
 .../graph/GraphBackedSearchIndexer.java         | 335 +++++++++++--------
 .../atlas/repository/graph/GraphHelper.java     |   2 +-
 .../graph/v1/AtlasRelationshipStoreV1.java      |   2 +-
 11 files changed, 316 insertions(+), 239 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/common/src/main/java/org/apache/atlas/repository/Constants.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/atlas/repository/Constants.java b/common/src/main/java/org/apache/atlas/repository/Constants.java
index d63f361..265be78 100644
--- a/common/src/main/java/org/apache/atlas/repository/Constants.java
+++ b/common/src/main/java/org/apache/atlas/repository/Constants.java
@@ -29,7 +29,9 @@ public final class Constants {
      */
 
     public static final String INTERNAL_PROPERTY_KEY_PREFIX = "__";
+    public static final String RELATIONSHIP_PROPERTY_KEY_PREFIX = "_r";
     public static final String GUID_PROPERTY_KEY = INTERNAL_PROPERTY_KEY_PREFIX + "guid";
+    public static final String RELATIONSHIP_GUID_PROPERTY_KEY = RELATIONSHIP_PROPERTY_KEY_PREFIX + GUID_PROPERTY_KEY;
 
     /**
      * Entity type name property key.

http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/graphdb/api/src/main/java/org/apache/atlas/repository/graphdb/AtlasGraphManagement.java
----------------------------------------------------------------------
diff --git a/graphdb/api/src/main/java/org/apache/atlas/repository/graphdb/AtlasGraphManagement.java b/graphdb/api/src/main/java/org/apache/atlas/repository/graphdb/AtlasGraphManagement.java
index 620ba10..09f584e 100644
--- a/graphdb/api/src/main/java/org/apache/atlas/repository/graphdb/AtlasGraphManagement.java
+++ b/graphdb/api/src/main/java/org/apache/atlas/repository/graphdb/AtlasGraphManagement.java
@@ -35,15 +35,6 @@ public interface AtlasGraphManagement {
     boolean containsPropertyKey(String key);
 
     /**
-     * Creates a full text index for the given property.
-     *
-     * @param  indexName the name of the index to create
-     * @param propertyKey full text property to index
-     * @param backingIndex the name of the backing index to use
-     */
-    void createFullTextIndex(String indexName, AtlasPropertyKey propertyKey, String backingIndex);
-
-    /**
      * Rolls back the changes that have been made to the management system.
      */
     void rollback();
@@ -87,13 +78,22 @@ public interface AtlasGraphManagement {
     AtlasEdgeLabel getEdgeLabel(String label);
 
     /**
-     * Creates a composite index for the graph.
+     * Creates a composite vertex index for the graph.
+     *
+     * @param propertyName
+     * @param isUnique
+     * @param propertyKeys
+     */
+    void createVertexCompositeIndex(String propertyName, boolean isUnique, List<AtlasPropertyKey> propertyKeys);
+
+    /**
+     * Creates a composite edge index for the graph.
      *
      * @param propertyName
      * @param isUnique
      * @param propertyKeys
      */
-    void createExactMatchIndex(String propertyName, boolean isUnique, List<AtlasPropertyKey> propertyKeys);
+    void createEdgeCompositeIndex(String propertyName, boolean isUnique, List<AtlasPropertyKey> propertyKeys);
 
     /**
      * Looks up the index with the specified name in the graph.  Returns null if
@@ -109,23 +109,33 @@ public interface AtlasGraphManagement {
      *
      * @param name the name of the index to create
      * @param backingIndex the name of the backing index to use
+     * @param propertyKeys list of propertyKeys to be added to the index
      */
-    void createVertexIndex(String name, String backingIndex, List<AtlasPropertyKey> propertyKeys);
+    void createVertexMixedIndex(String name, String backingIndex, List<AtlasPropertyKey> propertyKeys);
 
     /**
-     * Adds a property key to the given index in the graph.
+     * Creates a mixed Edge index for the graph.
      *
-     * @param vertexIndex
-     * @param propertyKey
+     * @param index the name of the index to create
+     * @param backingIndex the name of the backing index to use
+     * @param propertyKeys list of propertyKeys to be added to the index
      */
-    void addVertexIndexKey(String vertexIndex, AtlasPropertyKey propertyKey);
+    void createEdgeMixedIndex(String index, String backingIndex, List<AtlasPropertyKey> propertyKeys);
 
     /**
-     * Creates a mixed Edge index for the graph.
+     * Creates a full text index for the given property.
      *
      * @param index the name of the index to create
      * @param backingIndex the name of the backing index to use
+     * @param propertyKeys list of propertyKeys to be added to the index
      */
-    void createEdgeIndex(String index, String backingIndex);
+    void createFullTextMixedIndex(String index, String backingIndex, List<AtlasPropertyKey> propertyKeys);
 
+    /**
+     * Adds a property key to the given index in the graph.
+     *
+     * @param vertexIndex
+     * @param propertyKey
+     */
+    void addMixedIndex(String vertexIndex, AtlasPropertyKey propertyKey);
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/graphdb/janus/src/main/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusGraphManagement.java
----------------------------------------------------------------------
diff --git a/graphdb/janus/src/main/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusGraphManagement.java b/graphdb/janus/src/main/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusGraphManagement.java
index 036c566..cf1965b 100644
--- a/graphdb/janus/src/main/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusGraphManagement.java
+++ b/graphdb/janus/src/main/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusGraphManagement.java
@@ -25,6 +25,7 @@ import org.janusgraph.core.schema.Mapping;
 import org.janusgraph.core.schema.PropertyKeyMaker;
 import org.janusgraph.core.schema.JanusGraphIndex;
 import org.janusgraph.core.schema.JanusGraphManagement;
+import org.janusgraph.core.schema.JanusGraphManagement.IndexBuilder;
 import org.janusgraph.graphdb.internal.Token;
 import org.apache.atlas.repository.graphdb.AtlasCardinality;
 import org.apache.atlas.repository.graphdb.AtlasEdgeLabel;
@@ -33,7 +34,6 @@ import org.apache.atlas.repository.graphdb.AtlasGraphManagement;
 import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
 import org.apache.commons.lang.StringUtils;
 import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,50 +46,52 @@ import java.util.Set;
  * Janus implementation of AtlasGraphManagement.
  */
 public class AtlasJanusGraphManagement implements AtlasGraphManagement {
-
-    private static final Logger LOG = LoggerFactory.getLogger(AtlasJanusGraphManagement.class);
-
+    private static final Logger LOG            = LoggerFactory.getLogger(AtlasJanusGraphManagement.class);
     private static final char[] RESERVED_CHARS = { '{', '}', '"', '$', Token.SEPARATOR_CHAR };
 
-    private AtlasJanusGraph graph;
+    private AtlasJanusGraph      graph;
     private JanusGraphManagement management;
-
-    private Set<String> newMultProperties = new HashSet<>();
+    private Set<String>          newMultProperties = new HashSet<>();
 
     public AtlasJanusGraphManagement(AtlasJanusGraph graph, JanusGraphManagement managementSystem) {
         this.management = managementSystem;
-        this.graph = graph;
+        this.graph      = graph;
     }
 
     @Override
-    public void createVertexIndex(String propertyName, String backingIndex, List<AtlasPropertyKey> propertyKeys) {
+    public void createVertexMixedIndex(String indexName, String backingIndex, List<AtlasPropertyKey> propertyKeys) {
+        IndexBuilder indexBuilder = management.buildIndex(indexName, Vertex.class);
 
-        JanusGraphManagement.IndexBuilder indexBuilder = management.buildIndex(propertyName, Vertex.class);
         for (AtlasPropertyKey key : propertyKeys) {
             PropertyKey janusKey = AtlasJanusObjectFactory.createPropertyKey(key);
             indexBuilder.addKey(janusKey);
         }
+
         indexBuilder.buildMixedIndex(backingIndex);
     }
 
     @Override
-    public void createEdgeIndex(String index, String backingIndex) {
-        buildMixedIndex(index, Edge.class, backingIndex);
-    }
+    public void createEdgeMixedIndex(String indexName, String backingIndex, List<AtlasPropertyKey> propertyKeys) {
+        IndexBuilder indexBuilder = management.buildIndex(indexName, Edge.class);
 
-    private void buildMixedIndex(String index, Class<? extends Element> janusClass, String backingIndex) {
+        for (AtlasPropertyKey key : propertyKeys) {
+            PropertyKey janusKey = AtlasJanusObjectFactory.createPropertyKey(key);
+            indexBuilder.addKey(janusKey);
+        }
 
-        management.buildIndex(index, janusClass).buildMixedIndex(backingIndex);
+        indexBuilder.buildMixedIndex(backingIndex);
     }
 
     @Override
-    public void createFullTextIndex(String indexName, AtlasPropertyKey propertyKey, String backingIndex) {
+    public void createFullTextMixedIndex(String indexName, String backingIndex, List<AtlasPropertyKey> propertyKeys) {
+        IndexBuilder indexBuilder = management.buildIndex(indexName, Vertex.class);
 
-        PropertyKey fullText = AtlasJanusObjectFactory.createPropertyKey(propertyKey);
+        for (AtlasPropertyKey key : propertyKeys) {
+            PropertyKey janusKey = AtlasJanusObjectFactory.createPropertyKey(key);
+            indexBuilder.addKey(janusKey, org.janusgraph.core.schema.Parameter.of("mapping", Mapping.TEXT));
+        }
 
-        management.buildIndex(indexName, Vertex.class)
-                .addKey(fullText, org.janusgraph.core.schema.Parameter.of("mapping", Mapping.TEXT))
-                .buildMixedIndex(backingIndex);
+        indexBuilder.buildMixedIndex(backingIndex);
     }
 
     @Override
@@ -114,25 +116,28 @@ public class AtlasJanusGraphManagement implements AtlasGraphManagement {
         //for some reason, name checking was removed from StandardPropertyKeyMaker.make()
         //in Janus.  For consistency, do the check here.
         Preconditions.checkArgument(StringUtils.isNotBlank(name), "Need to specify name");
+
         for (char c : RESERVED_CHARS) {
-            Preconditions.checkArgument(name.indexOf(c) < 0, "Name can not contains reserved character %s: %s", c,
-                    name);
+            Preconditions.checkArgument(name.indexOf(c) < 0, "Name can not contains reserved character %s: %s", c, name);
         }
 
     }
 
     @Override
     public AtlasPropertyKey makePropertyKey(String propertyName, Class propertyClass, AtlasCardinality cardinality) {
-
         if (cardinality.isMany()) {
             newMultProperties.add(propertyName);
         }
+
         PropertyKeyMaker propertyKeyBuilder = management.makePropertyKey(propertyName).dataType(propertyClass);
+
         if (cardinality != null) {
             Cardinality janusCardinality = AtlasJanusObjectFactory.createCardinality(cardinality);
             propertyKeyBuilder.cardinality(janusCardinality);
         }
+
         PropertyKey propertyKey = propertyKeyBuilder.make();
+
         return GraphDbObjectFactory.createPropertyKey(propertyKey);
     }
 
@@ -151,6 +156,7 @@ public class AtlasJanusGraphManagement implements AtlasGraphManagement {
 
         for (int i = 0;; i++) {
             String deletedKeyName = janusPropertyKey + "_deleted_" + i;
+
             if (null == management.getPropertyKey(deletedKeyName)) {
                 management.changeName(janusPropertyKey, deletedKeyName);
                 break;
@@ -161,6 +167,7 @@ public class AtlasJanusGraphManagement implements AtlasGraphManagement {
     @Override
     public AtlasPropertyKey getPropertyKey(String propertyName) {
         checkName(propertyName);
+
         return GraphDbObjectFactory.createPropertyKey(management.getPropertyKey(propertyName));
     }
 
@@ -169,37 +176,50 @@ public class AtlasJanusGraphManagement implements AtlasGraphManagement {
         return GraphDbObjectFactory.createEdgeLabel(management.getEdgeLabel(label));
     }
 
-    public void createExactMatchVertexIndex(String propertyName, boolean enforceUniqueness,
-                                      List<AtlasPropertyKey> propertyKeys) {
-
-        JanusGraphManagement.IndexBuilder indexBuilder = management.buildIndex(propertyName, Vertex.class);
-        for (AtlasPropertyKey key : propertyKeys) {
-            PropertyKey janusKey = AtlasJanusObjectFactory.createPropertyKey(key);
-            indexBuilder.addKey(janusKey);
-        }
-        if (enforceUniqueness) {
-            indexBuilder.unique();
-        }
-        indexBuilder.buildCompositeIndex();
-    }
-
     @Override
-    public void addVertexIndexKey(String indexName, AtlasPropertyKey propertyKey) {
-        PropertyKey janusKey = AtlasJanusObjectFactory.createPropertyKey(propertyKey);
+    public void addMixedIndex(String indexName, AtlasPropertyKey propertyKey) {
+        PropertyKey     janusKey    = AtlasJanusObjectFactory.createPropertyKey(propertyKey);
         JanusGraphIndex vertexIndex = management.getGraphIndex(indexName);
+
         management.addIndexKey(vertexIndex, janusKey);
     }
 
     @Override
     public AtlasGraphIndex getGraphIndex(String indexName) {
         JanusGraphIndex index = management.getGraphIndex(indexName);
+
         return GraphDbObjectFactory.createGraphIndex(index);
     }
 
     @Override
-    public void createExactMatchIndex(String propertyName, boolean isUnique,
-            List<AtlasPropertyKey> propertyKeys) {
-        createExactMatchVertexIndex(propertyName, isUnique, propertyKeys);
+    public void createVertexCompositeIndex(String propertyName, boolean isUnique, List<AtlasPropertyKey> propertyKeys) {
+        IndexBuilder indexBuilder = management.buildIndex(propertyName, Vertex.class);
+
+        for (AtlasPropertyKey key : propertyKeys) {
+            PropertyKey janusKey = AtlasJanusObjectFactory.createPropertyKey(key);
+            indexBuilder.addKey(janusKey);
+        }
+
+        if (isUnique) {
+            indexBuilder.unique();
+        }
+
+        indexBuilder.buildCompositeIndex();
     }
 
-}
+    @Override
+    public void createEdgeCompositeIndex(String propertyName, boolean isUnique, List<AtlasPropertyKey> propertyKeys) {
+        IndexBuilder indexBuilder = management.buildIndex(propertyName, Edge.class);
+
+        for (AtlasPropertyKey key : propertyKeys) {
+            PropertyKey janusKey = AtlasJanusObjectFactory.createPropertyKey(key);
+            indexBuilder.addKey(janusKey);
+        }
+
+        if (isUnique) {
+            indexBuilder.unique();
+        }
+
+        indexBuilder.buildCompositeIndex();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/graphdb/janus/src/test/java/org/apache/atlas/repository/graphdb/janus/AbstractGraphDatabaseTest.java
----------------------------------------------------------------------
diff --git a/graphdb/janus/src/test/java/org/apache/atlas/repository/graphdb/janus/AbstractGraphDatabaseTest.java b/graphdb/janus/src/test/java/org/apache/atlas/repository/graphdb/janus/AbstractGraphDatabaseTest.java
index 43b95ca..f72b412 100644
--- a/graphdb/janus/src/test/java/org/apache/atlas/repository/graphdb/janus/AbstractGraphDatabaseTest.java
+++ b/graphdb/janus/src/test/java/org/apache/atlas/repository/graphdb/janus/AbstractGraphDatabaseTest.java
@@ -56,8 +56,7 @@ public abstract class AbstractGraphDatabaseTest {
         AtlasGraphManagement mgmt = db.getGraph().getManagementSystem();
 
         if (mgmt.getGraphIndex(BACKING_INDEX_NAME) == null) {
-            mgmt.createVertexIndex(BACKING_INDEX_NAME, Constants.BACKING_INDEX,
-                    Collections.<AtlasPropertyKey>emptyList());
+            mgmt.createVertexMixedIndex(BACKING_INDEX_NAME, Constants.BACKING_INDEX, Collections.emptyList());
         }
         mgmt.makePropertyKey("age13", Integer.class, AtlasCardinality.SINGLE);
 
@@ -100,14 +99,14 @@ public abstract class AbstractGraphDatabaseTest {
         AtlasPropertyKey key = management.makePropertyKey(propertyName, propertyClass, cardinality);
         try {
             if (propertyClass != Integer.class) {
-                management.addVertexIndexKey(BACKING_INDEX_NAME, key);
+                management.addMixedIndex(BACKING_INDEX_NAME, key);
             }
         } catch(Throwable t) {
             //ok
             t.printStackTrace();
         }
         try {
-            management.createExactMatchIndex(propertyName, isUnique, Collections.singletonList(key));
+            management.createVertexCompositeIndex(propertyName, isUnique, Collections.singletonList(key));
 
         } catch(Throwable t) {
             //ok

http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/graphdb/janus/src/test/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusDatabaseTest.java
----------------------------------------------------------------------
diff --git a/graphdb/janus/src/test/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusDatabaseTest.java b/graphdb/janus/src/test/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusDatabaseTest.java
index ed4099b..3ab3c1e 100644
--- a/graphdb/janus/src/test/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusDatabaseTest.java
+++ b/graphdb/janus/src/test/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusDatabaseTest.java
@@ -30,10 +30,8 @@ import org.apache.atlas.repository.graphdb.AtlasGraphQuery;
 import org.apache.atlas.repository.graphdb.AtlasGraphQuery.ComparisionOperator;
 import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
 import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.runner.LocalSolrRunner;
 import org.apache.atlas.typesystem.types.DataTypes.TypeCategory;
 import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import java.math.BigDecimal;
@@ -43,7 +41,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
-import static org.apache.atlas.graph.GraphSandboxUtil.useLocalSolr;
 import static org.testng.Assert.*;
 
 /**
@@ -67,7 +64,7 @@ public class AtlasJanusDatabaseTest {
                 AtlasPropertyKey propertyKey = mgmt.getPropertyKey(propertyName);
                 if (propertyKey == null) {
                     propertyKey = mgmt.makePropertyKey(propertyName, String.class, AtlasCardinality.SET);
-                    mgmt.createExactMatchIndex(propertyName, false, Collections.singletonList(propertyKey));
+                    mgmt.createVertexCompositeIndex(propertyName, false, Collections.singletonList(propertyKey));
                 }
             }
             mgmt.commit();

http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/graphdb/titan0/src/main/java/org/apache/atlas/repository/graphdb/titan0/Titan0GraphManagement.java
----------------------------------------------------------------------
diff --git a/graphdb/titan0/src/main/java/org/apache/atlas/repository/graphdb/titan0/Titan0GraphManagement.java b/graphdb/titan0/src/main/java/org/apache/atlas/repository/graphdb/titan0/Titan0GraphManagement.java
index 5b9c933..32e4d02 100644
--- a/graphdb/titan0/src/main/java/org/apache/atlas/repository/graphdb/titan0/Titan0GraphManagement.java
+++ b/graphdb/titan0/src/main/java/org/apache/atlas/repository/graphdb/titan0/Titan0GraphManagement.java
@@ -58,23 +58,16 @@ public class Titan0GraphManagement implements AtlasGraphManagement {
     }
 
     @Override
-    public void createEdgeIndex(String index, String backingIndex) {
-        buildMixedIndex(index, Edge.class, backingIndex);
-    }
-
-    private void buildMixedIndex(String index, Class<? extends Element> titanClass, String backingIndex) {
-
-        management.buildIndex(index, titanClass).buildMixedIndex(backingIndex);
+    public void createEdgeMixedIndex(String index, String backingIndex, List<AtlasPropertyKey> propertyKeys) {
     }
 
     @Override
-    public void createFullTextIndex(String indexName, AtlasPropertyKey propertyKey, String backingIndex) {
+    public void createFullTextMixedIndex(String index, String backingIndex, List<AtlasPropertyKey> propertyKeys) {
+    }
 
-        PropertyKey fullText = TitanObjectFactory.createPropertyKey(propertyKey);
+    private void buildMixedIndex(String index, Class<? extends Element> titanClass, String backingIndex) {
 
-        management.buildIndex(indexName, Vertex.class)
-                .addKey(fullText, com.thinkaurelius.titan.core.schema.Parameter.of("mapping", Mapping.TEXT))
-                .buildMixedIndex(backingIndex);
+        management.buildIndex(index, titanClass).buildMixedIndex(backingIndex);
     }
 
     @Override
@@ -146,8 +139,8 @@ public class Titan0GraphManagement implements AtlasGraphManagement {
     }
 
     @Override
-    public void createExactMatchIndex(String propertyName, boolean enforceUniqueness,
-            List<AtlasPropertyKey> propertyKeys) {
+    public void createVertexCompositeIndex(String propertyName, boolean enforceUniqueness,
+                                           List<AtlasPropertyKey> propertyKeys) {
 
         TitanManagement.IndexBuilder indexBuilder = management.buildIndex(propertyName, Vertex.class);
         for(AtlasPropertyKey key : propertyKeys) {
@@ -161,7 +154,23 @@ public class Titan0GraphManagement implements AtlasGraphManagement {
     }
 
     @Override
-    public void createVertexIndex(String propertyName, String backingIndex, List<AtlasPropertyKey> propertyKeys) {
+    public void createEdgeCompositeIndex(String propertyName, boolean isUnique, List<AtlasPropertyKey> propertyKeys) {
+        TitanManagement.IndexBuilder indexBuilder = management.buildIndex(propertyName, Edge.class);
+
+        for(AtlasPropertyKey key : propertyKeys) {
+            PropertyKey titanKey = TitanObjectFactory.createPropertyKey(key);
+            indexBuilder.addKey(titanKey);
+        }
+
+        if (isUnique) {
+            indexBuilder.unique();
+        }
+
+        indexBuilder.buildCompositeIndex();
+    }
+
+    @Override
+    public void createVertexMixedIndex(String propertyName, String backingIndex, List<AtlasPropertyKey> propertyKeys) {
 
         TitanManagement.IndexBuilder indexBuilder = management.buildIndex(propertyName, Vertex.class);
         for(AtlasPropertyKey key : propertyKeys) {
@@ -173,7 +182,7 @@ public class Titan0GraphManagement implements AtlasGraphManagement {
 
 
     @Override
-    public void addVertexIndexKey(String indexName, AtlasPropertyKey propertyKey) {
+    public void addMixedIndex(String indexName, AtlasPropertyKey propertyKey) {
         PropertyKey titanKey = TitanObjectFactory.createPropertyKey(propertyKey);
         TitanGraphIndex vertexIndex = management.getGraphIndex(indexName);
         management.addIndexKey(vertexIndex, titanKey);

http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/graphdb/titan0/src/test/java/org/apache/atlas/repository/graphdb/titan0/AbstractGraphDatabaseTest.java
----------------------------------------------------------------------
diff --git a/graphdb/titan0/src/test/java/org/apache/atlas/repository/graphdb/titan0/AbstractGraphDatabaseTest.java b/graphdb/titan0/src/test/java/org/apache/atlas/repository/graphdb/titan0/AbstractGraphDatabaseTest.java
index fbbfdef..513813d 100644
--- a/graphdb/titan0/src/test/java/org/apache/atlas/repository/graphdb/titan0/AbstractGraphDatabaseTest.java
+++ b/graphdb/titan0/src/test/java/org/apache/atlas/repository/graphdb/titan0/AbstractGraphDatabaseTest.java
@@ -55,8 +55,7 @@ public abstract class AbstractGraphDatabaseTest {
         AtlasGraphManagement mgmt = db.getGraph().getManagementSystem();
 
         if (mgmt.getGraphIndex(BACKING_INDEX_NAME) == null) {
-            mgmt.createVertexIndex(BACKING_INDEX_NAME, Constants.BACKING_INDEX,
-                    Collections.<AtlasPropertyKey>emptyList());
+            mgmt.createVertexMixedIndex(BACKING_INDEX_NAME, Constants.BACKING_INDEX, Collections.emptyList());
         }
         mgmt.makePropertyKey("age13", Integer.class, AtlasCardinality.SINGLE);
 
@@ -100,14 +99,14 @@ public abstract class AbstractGraphDatabaseTest {
         AtlasPropertyKey key = management.makePropertyKey(propertyName, propertyClass, cardinality);
         try {
             if (propertyClass != Integer.class) {
-                management.addVertexIndexKey(BACKING_INDEX_NAME, key);
+                management.addMixedIndex(BACKING_INDEX_NAME, key);
             }
         } catch(Throwable t) {
             //ok
             t.printStackTrace();
         }
         try {
-            management.createExactMatchIndex(propertyName, isUnique, Collections.singletonList(key));
+            management.createVertexCompositeIndex(propertyName, isUnique, Collections.singletonList(key));
 
         } catch(Throwable t) {
             //ok

http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/graphdb/titan0/src/test/java/org/apache/atlas/repository/graphdb/titan0/Titan0DatabaseTest.java
----------------------------------------------------------------------
diff --git a/graphdb/titan0/src/test/java/org/apache/atlas/repository/graphdb/titan0/Titan0DatabaseTest.java b/graphdb/titan0/src/test/java/org/apache/atlas/repository/graphdb/titan0/Titan0DatabaseTest.java
index 3756382..e255e6c 100644
--- a/graphdb/titan0/src/test/java/org/apache/atlas/repository/graphdb/titan0/Titan0DatabaseTest.java
+++ b/graphdb/titan0/src/test/java/org/apache/atlas/repository/graphdb/titan0/Titan0DatabaseTest.java
@@ -65,7 +65,7 @@ public class Titan0DatabaseTest {
                 AtlasPropertyKey propertyKey = mgmt.getPropertyKey(propertyName);
                 if (propertyKey == null) {
                     propertyKey = mgmt.makePropertyKey(propertyName, String.class, AtlasCardinality.SET);
-                    mgmt.createExactMatchIndex(propertyName, false, Collections.singletonList(propertyKey));
+                    mgmt.createVertexCompositeIndex(propertyName, false, Collections.singletonList(propertyKey));
                 }
             }
             mgmt.commit();

http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
index 9f1206c..31620b1 100755
--- a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
+++ b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
@@ -44,6 +44,7 @@ import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
 import org.apache.atlas.type.AtlasClassificationType;
 import org.apache.atlas.type.AtlasEntityType;
 import org.apache.atlas.type.AtlasEnumType;
+import org.apache.atlas.type.AtlasRelationshipType;
 import org.apache.atlas.type.AtlasStructType;
 import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.type.AtlasTypeRegistry;
@@ -64,6 +65,26 @@ import java.util.List;
 import java.util.Set;
 
 import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.*;
+import static org.apache.atlas.repository.Constants.BACKING_INDEX;
+import static org.apache.atlas.repository.Constants.CREATED_BY_KEY;
+import static org.apache.atlas.repository.Constants.EDGE_INDEX;
+import static org.apache.atlas.repository.Constants.ENTITY_TEXT_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.ENTITY_TYPE_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.FULLTEXT_INDEX;
+import static org.apache.atlas.repository.Constants.GUID_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.MODIFIED_BY_KEY;
+import static org.apache.atlas.repository.Constants.RELATIONSHIP_GUID_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.STATE_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.SUPER_TYPES_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.TIMESTAMP_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.TRAIT_NAMES_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.TYPENAME_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.VERTEX_INDEX;
+import static org.apache.atlas.repository.Constants.VERTEX_TYPE_PROPERTY_KEY;
+import static org.apache.atlas.repository.graphdb.AtlasCardinality.LIST;
+import static org.apache.atlas.repository.graphdb.AtlasCardinality.SET;
+import static org.apache.atlas.repository.graphdb.AtlasCardinality.SINGLE;
 
 
 /**
@@ -73,8 +94,8 @@ import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.*;
 public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChangeHandler, TypeDefChangeListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(GraphBackedSearchIndexer.class);
-    
-    private static final List<Class> VERTEX_INDEX_EXCLUSIONS = new ArrayList() {
+
+    private static final List<Class> INDEX_EXCLUSION_CLASSES = new ArrayList() {
         {
             add(Boolean.class);
             add(BigDecimal.class);
@@ -97,7 +118,7 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
     }
 
     @VisibleForTesting
-    GraphBackedSearchIndexer( IAtlasGraphProvider provider, Configuration configuration, AtlasTypeRegistry typeRegistry)
+    GraphBackedSearchIndexer(IAtlasGraphProvider provider, Configuration configuration, AtlasTypeRegistry typeRegistry)
             throws IndexException, RepositoryException {
         this.provider = provider;
         this.typeRegistry = typeRegistry;
@@ -178,7 +199,7 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
                 management = provider.get().getManagementSystem();
 
                 if (management != null) {
-                    AtlasGraphIndex vertexIndex = management.getGraphIndex(Constants.VERTEX_INDEX);
+                    AtlasGraphIndex vertexIndex = management.getGraphIndex(VERTEX_INDEX);
 
                     if (vertexIndex != null) {
                         recomputeIndexedKeys = false;
@@ -214,12 +235,11 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
      * Initializes the indices for the graph - create indices for Global AtlasVertex Keys
      */
     private void initialize() throws RepositoryException, IndexException {
-        
-        initialize(provider.get());    
+        initialize(provider.get());
     }
     
     /**
-     * Initializes the indices for the graph - create indices for Global AtlasVertex Keys
+     * Initializes the indices for the graph - create indices for Global AtlasVertex and AtlasEdge Keys
      */
     private void initialize(AtlasGraph graph) throws RepositoryException, IndexException {
         AtlasGraphManagement management = graph.getManagementSystem();
@@ -227,64 +247,45 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
         try {
             LOG.info("Creating indexes for graph.");
 
-            if (management.getGraphIndex(Constants.VERTEX_INDEX) == null) {
-                management.createVertexIndex(Constants.VERTEX_INDEX, Constants.BACKING_INDEX, Collections.<AtlasPropertyKey>emptyList());
+            if (management.getGraphIndex(VERTEX_INDEX) == null) {
+                management.createVertexMixedIndex(VERTEX_INDEX, BACKING_INDEX, Collections.emptyList());
 
-                LOG.info("Created index {}", Constants.VERTEX_INDEX);
+                LOG.info("Created index : {}", VERTEX_INDEX);
             }
 
-            if (management.getGraphIndex(Constants.EDGE_INDEX) == null) {
-                management.createEdgeIndex(Constants.EDGE_INDEX, Constants.BACKING_INDEX);
+            if (management.getGraphIndex(EDGE_INDEX) == null) {
+                management.createEdgeMixedIndex(EDGE_INDEX, BACKING_INDEX, Collections.emptyList());
 
-                LOG.info("Created index {}", Constants.EDGE_INDEX);
+                LOG.info("Created index : {}", EDGE_INDEX);
             }
 
+            if (management.getGraphIndex(FULLTEXT_INDEX) == null) {
+                management.createFullTextMixedIndex(FULLTEXT_INDEX, BACKING_INDEX, Collections.emptyList());
 
-            // create a composite index for guid as its unique
-            createIndexes(management, Constants.GUID_PROPERTY_KEY, String.class, true,
-                    AtlasCardinality.SINGLE, true, true);
-
-            // Add creation_timestamp property to Vertex Index (mixed index)
-            createIndexes(management, Constants.TIMESTAMP_PROPERTY_KEY, Long.class, false, AtlasCardinality.SINGLE, false, false);
-
-            // Add modification_timestamp property to Vertex Index (mixed index)
-            createIndexes(management, Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY, Long.class, false,
-                    AtlasCardinality.SINGLE, false, false);
-
-
-            // create a mixed index for entity state. Set systemProperty flag deliberately to false
-            // so that it doesnt create a composite index which has issues with
-            // titan 0.5.4 - Refer https://groups.google.com/forum/#!searchin/aureliusgraphs/hemanth/aureliusgraphs/bx7T843mzXU/fjAsclx7GAAJ
-            createIndexes(management, Constants.STATE_PROPERTY_KEY, String.class, false, AtlasCardinality.SINGLE, false, false);
-
-            // Create a composite and mixed index for created by property
-            createIndexes(management, Constants.CREATED_BY_KEY, String.class, false,
-                    AtlasCardinality.SINGLE, true, true);
-
-            // Create a composite and mixed index for modified by property
-            createIndexes(management, Constants.MODIFIED_BY_KEY, String.class, false,
-                    AtlasCardinality.SINGLE, true, true);
-
-            // create a composite and mixed index for type since it can be combined with other keys
-            createIndexes(management, Constants.ENTITY_TYPE_PROPERTY_KEY, String.class, false, AtlasCardinality.SINGLE,
-                    true, true);
-
-            // create a composite and mixed index for type since it can be combined with other keys
-            createIndexes(management, Constants.SUPER_TYPES_PROPERTY_KEY, String.class, false, AtlasCardinality.SET,
-                    true, true);
-
-            // create a composite and mixed index for traitNames since it can be combined with other
-            // keys. Traits must be a set and not a list.
-            createIndexes(management, Constants.TRAIT_NAMES_PROPERTY_KEY, String.class, false, AtlasCardinality.SET,
-                    true, true);
-
-            // Index for full text search
-            createFullTextIndex(management);
+                LOG.info("Created index : {}", FULLTEXT_INDEX);
+            }
 
-            //Indexes for graph backed type system store
-            createTypeStoreIndexes(management);
+            // create vertex indexes
+            createVertexIndex(management, GUID_PROPERTY_KEY, String.class, true, SINGLE, true, true);
+            createVertexIndex(management, TIMESTAMP_PROPERTY_KEY, Long.class, false, SINGLE, false, false);
+            createVertexIndex(management, MODIFICATION_TIMESTAMP_PROPERTY_KEY, Long.class, false, SINGLE, false, false);
+            createVertexIndex(management, STATE_PROPERTY_KEY, String.class, false, SINGLE, false, false);
+            createVertexIndex(management, CREATED_BY_KEY, String.class, false, SINGLE, true, true);
+            createVertexIndex(management, MODIFIED_BY_KEY, String.class, false, SINGLE, true, true);
+            createVertexIndex(management, ENTITY_TYPE_PROPERTY_KEY, String.class, false, SINGLE, true, true);
+            createVertexIndex(management, SUPER_TYPES_PROPERTY_KEY, String.class, false, SET, true, true);
+            createVertexIndex(management, TRAIT_NAMES_PROPERTY_KEY, String.class, false, SET, true, true);
+            createVertexIndex(management, TYPENAME_PROPERTY_KEY, String.class, true, SINGLE, true, true);
+            createVertexIndex(management, VERTEX_TYPE_PROPERTY_KEY, String.class, false, SINGLE, true, true);
+
+            // create edge indexes
+            createEdgeIndex(management, RELATIONSHIP_GUID_PROPERTY_KEY, String.class, SINGLE, true);
+
+            // create fulltext indexes
+            createFullTextIndex(management, ENTITY_TEXT_PROPERTY_KEY, String.class, SINGLE);
 
             commit(management);
+
             LOG.info("Index creation for global keys complete.");
         } catch (Throwable t) {
             rollback(management);
@@ -292,27 +293,6 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
         }
     }
 
-    private void createFullTextIndex(AtlasGraphManagement management) {
-        if (!management.containsPropertyKey(Constants.ENTITY_TEXT_PROPERTY_KEY)) {
-            AtlasPropertyKey fullText =
-                    management.makePropertyKey(Constants.ENTITY_TEXT_PROPERTY_KEY, String.class, AtlasCardinality.SINGLE);
-
-            management.createFullTextIndex(Constants.FULLTEXT_INDEX, fullText, Constants.BACKING_INDEX);
-
-            LOG.info("Created index {}", Constants.ENTITY_TEXT_PROPERTY_KEY);
-        }
-    }
-
-    private void createTypeStoreIndexes(AtlasGraphManagement management) {
-        //Create unique index on typeName
-        createIndexes(management, Constants.TYPENAME_PROPERTY_KEY, String.class, true, AtlasCardinality.SINGLE,
-                true, true);
-
-        //create index on vertex type
-        createIndexes(management, Constants.VERTEX_TYPE_PROPERTY_KEY, String.class, false, AtlasCardinality.SINGLE,
-                true, true);
-    }
-
     private void addIndexForType(AtlasGraphManagement management, AtlasBaseTypeDef typeDef) {
         if (typeDef instanceof AtlasEnumDef) {
             // Only handle complex types like Struct, Classification and Entity
@@ -331,32 +311,39 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
         }
     }
 
-    private void createIndexForAttribute(AtlasGraphManagement management, String typeName,
-                                         AtlasAttributeDef attributeDef) {
-        final String propertyName = GraphHelper.encodePropertyKey(typeName + "." + attributeDef.getName());
-        AtlasCardinality cardinality = toAtlasCardinality(attributeDef.getCardinality());
-        boolean isUnique = attributeDef.getIsUnique();
-        boolean isIndexable = attributeDef.getIsIndexable();
-        String attribTypeName = attributeDef.getTypeName();
-        boolean isBuiltInType = AtlasTypeUtil.isBuiltInType(attribTypeName);
-        boolean isArrayType = AtlasTypeUtil.isArrayType(attribTypeName);
-        boolean isMapType = AtlasTypeUtil.isMapType(attribTypeName);
-
+    private void createIndexForAttribute(AtlasGraphManagement management, String typeName, AtlasAttributeDef attributeDef) {
+        final String     propertyName   = GraphHelper.encodePropertyKey(typeName + "." + attributeDef.getName());
+        AtlasCardinality cardinality    = toAtlasCardinality(attributeDef.getCardinality());
+        boolean          isUnique       = attributeDef.getIsUnique();
+        boolean          isIndexable    = attributeDef.getIsIndexable();
+        String           attribTypeName = attributeDef.getTypeName();
+        boolean          isBuiltInType  = AtlasTypeUtil.isBuiltInType(attribTypeName);
+        boolean          isArrayType    = AtlasTypeUtil.isArrayType(attribTypeName);
+        boolean          isMapType      = AtlasTypeUtil.isMapType(attribTypeName);
 
         try {
-            AtlasType atlasType = typeRegistry.getType(attribTypeName);
+            AtlasType atlasType     = typeRegistry.getType(typeName);
+            AtlasType attributeType = typeRegistry.getType(attribTypeName);
 
-            if (isMapType || isClassificationType(atlasType)) {
+            if (isMapType || isClassificationType(attributeType)) {
                 LOG.warn("Ignoring non-indexable attribute {}", attribTypeName);
             } if (isArrayType) {
                 createLabelIfNeeded(management, propertyName, attribTypeName);
-            } if (isEntityType(atlasType)) {
+            } if (isEntityType(attributeType)) {
                 createEdgeLabel(management, propertyName);
             } else if (isBuiltInType) {
-                createIndexes(management, propertyName, getPrimitiveClass(attribTypeName), isUnique, cardinality, false, isIndexable);
-            } else if (isEnumType(atlasType)) {
-                createIndexes(management, propertyName, String.class, isUnique, cardinality, false, isIndexable);
-            } else if (isStructType(atlasType)) {
+                if (isRelationshipType(atlasType)) {
+                    createEdgeIndex(management, propertyName, getPrimitiveClass(attribTypeName), cardinality, false);
+                } else {
+                    createVertexIndex(management, propertyName, getPrimitiveClass(attribTypeName), isUnique, cardinality, false, isIndexable);
+                }
+            } else if (isEnumType(attributeType)) {
+                if (isRelationshipType(atlasType)) {
+                    createEdgeIndex(management, propertyName, String.class, cardinality, false);
+                } else {
+                    createVertexIndex(management, propertyName, String.class, isUnique, cardinality, false, isIndexable);
+                }
+            } else if (isStructType(attributeType)) {
                 AtlasStructDef structDef = typeRegistry.getStructDefByName(attribTypeName);
                 updateIndexForTypeDef(management, structDef);
             }
@@ -391,6 +378,10 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
         return type instanceof AtlasStructType;
     }
 
+    private boolean isRelationshipType(AtlasType type) {
+        return type instanceof AtlasRelationshipType;
+    }
+
     private Class getPrimitiveClass(String attribTypeName) {
         switch (attribTypeName.toLowerCase()) {
             case ATLAS_TYPE_BOOLEAN:
@@ -422,11 +413,11 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
     private AtlasCardinality toAtlasCardinality(AtlasAttributeDef.Cardinality cardinality) {
         switch (cardinality) {
             case SINGLE:
-                return AtlasCardinality.SINGLE;
+                return SINGLE;
             case LIST:
-                return AtlasCardinality.LIST;
+                return LIST;
             case SET:
-                return AtlasCardinality.SET;
+                return SET;
         }
         // Should never reach this point
         throw new IllegalArgumentException(String.format("Bad cardinality %s", cardinality));
@@ -448,25 +439,61 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
         }
     }
 
-    private AtlasPropertyKey createIndexes(AtlasGraphManagement management, String propertyName, Class propertyClass,
-            boolean isUnique, AtlasCardinality cardinality, boolean createCompositeForAttribute,
-            boolean createCompositeWithTypeandSuperTypes) {
+    private AtlasPropertyKey createVertexIndex(AtlasGraphManagement management, String propertyName, Class propertyClass,
+                                               boolean isUnique, AtlasCardinality cardinality, boolean createCompositeIndex,
+                                               boolean createCompositeIndexWithTypeAndSuperTypes) {
+        AtlasPropertyKey propertyKey = management.getPropertyKey(propertyName);
+
+        if (propertyKey == null) {
+            propertyKey = management.makePropertyKey(propertyName, propertyClass, cardinality);
+
+            if (isIndexApplicable(propertyClass, cardinality)) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Creating backing index for vertex property {} of type {} ", propertyName, propertyClass.getName());
+                }
+
+                management.addMixedIndex(VERTEX_INDEX, propertyKey);
+
+                LOG.info("Created backing index for vertex property {} of type {} ", propertyName, propertyClass.getName());
+            }
+        }
+
+        if (propertyKey != null) {
+            if (createCompositeIndex) {
+                createVertexCompositeIndex(management, propertyClass, propertyKey, isUnique);
+
+            } else if (createCompositeIndexWithTypeAndSuperTypes) {
+                createVertexCompositeIndexWithTypeName(management, propertyClass, propertyKey);
+                createVertexCompositeIndexWithSuperTypeName(management, propertyClass, propertyKey);
+            }
+        } else {
+            LOG.warn("Index not created for {}: propertyKey is null", propertyName);
+        }
+
+        return propertyKey;
+    }
 
+    private AtlasPropertyKey createEdgeIndex(AtlasGraphManagement management, String propertyName, Class propertyClass,
+                                             AtlasCardinality cardinality, boolean createCompositeIndex) {
         AtlasPropertyKey propertyKey = management.getPropertyKey(propertyName);
+
         if (propertyKey == null) {
             propertyKey = management.makePropertyKey(propertyName, propertyClass, cardinality);
 
-            updateVertexIndex(management, propertyName, propertyClass, cardinality, propertyKey);
+            if (isIndexApplicable(propertyClass, cardinality)) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Creating backing index for edge property {} of type {} ", propertyName, propertyClass.getName());
+                }
+
+                management.addMixedIndex(EDGE_INDEX, propertyKey);
+
+                LOG.info("Created backing index for edge property {} of type {} ", propertyName, propertyClass.getName());
+            }
         }
 
         if (propertyKey != null) {
-            if (createCompositeForAttribute) {
-                createExactMatchIndex(management, propertyClass, propertyKey, isUnique);
-            } else if (createCompositeWithTypeandSuperTypes) {
-                // Index with typename since typename+property key queries need to
-                // speed up
-                createExactMatchIndexWithTypeName(management, propertyClass, propertyKey);
-                createExactMatchIndexWithSuperTypeName(management, propertyClass, propertyKey);
+            if (createCompositeIndex) {
+                createEdgeCompositeIndex(management, propertyClass, propertyKey);
             }
         } else {
             LOG.warn("Index not created for {}: propertyKey is null", propertyName);
@@ -474,10 +501,32 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
 
         return propertyKey;
     }
+
+    private AtlasPropertyKey createFullTextIndex(AtlasGraphManagement management, String propertyName, Class propertyClass,
+                                                 AtlasCardinality cardinality) {
+        AtlasPropertyKey propertyKey = management.getPropertyKey(propertyName);
+
+        if (propertyKey == null) {
+            propertyKey = management.makePropertyKey(propertyName, propertyClass, cardinality);
+
+            if (isIndexApplicable(propertyClass, cardinality)) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Creating backing index for vertex property {} of type {} ", propertyName, propertyClass.getName());
+                }
+
+                management.addMixedIndex(FULLTEXT_INDEX, propertyKey);
+
+                LOG.info("Created backing index for vertex property {} of type {} ", propertyName, propertyClass.getName());
+            }
+
+            LOG.info("Created index {}", FULLTEXT_INDEX);
+        }
+
+        return propertyKey;
+    }
     
-    private void createExactMatchIndex(AtlasGraphManagement management, Class propertyClass,
-            AtlasPropertyKey propertyKey, boolean enforceUniqueness) {
-        
+    private void createVertexCompositeIndex(AtlasGraphManagement management, Class propertyClass, AtlasPropertyKey propertyKey,
+                                            boolean enforceUniqueness) {
         String propertyName = propertyKey.getName();
 
         if (LOG.isDebugEnabled()) {
@@ -485,33 +534,42 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
         }
 
         AtlasGraphIndex existingIndex = management.getGraphIndex(propertyName);
+
         if (existingIndex == null) {
-            management.createExactMatchIndex(propertyName, enforceUniqueness, Collections.singletonList(propertyKey));
+            management.createVertexCompositeIndex(propertyName, enforceUniqueness, Collections.singletonList(propertyKey));
 
             LOG.info("Created composite index for property {} of type {}; isUnique={} ", propertyName, propertyClass.getName(), enforceUniqueness);
         }
     }
-    
 
-    private void createExactMatchIndexWithTypeName(AtlasGraphManagement management,
-            Class propertyClass, AtlasPropertyKey propertyKey) {
-        createExactMatchIndexWithSystemProperty(management, propertyClass, propertyKey,
-                Constants.ENTITY_TYPE_PROPERTY_KEY, AtlasCardinality.SINGLE);
+    private void createEdgeCompositeIndex(AtlasGraphManagement management, Class propertyClass, AtlasPropertyKey propertyKey) {
+        String propertyName = propertyKey.getName();
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Creating composite index for property {} of type {}", propertyName, propertyClass.getName());
+        }
+
+        AtlasGraphIndex existingIndex = management.getGraphIndex(propertyName);
+
+        if (existingIndex == null) {
+            management.createEdgeCompositeIndex(propertyName, false, Collections.singletonList(propertyKey));
+
+            LOG.info("Created composite index for property {} of type {}", propertyName, propertyClass.getName());
+        }
     }
 
-    private void createExactMatchIndexWithSuperTypeName(AtlasGraphManagement management,
-            Class propertyClass, AtlasPropertyKey propertyKey) {
-        createExactMatchIndexWithSystemProperty(management, propertyClass, propertyKey,
-                Constants.SUPER_TYPES_PROPERTY_KEY, AtlasCardinality.SET);
+    private void createVertexCompositeIndexWithTypeName(AtlasGraphManagement management, Class propertyClass, AtlasPropertyKey propertyKey) {
+        createVertexCompositeIndexWithSystemProperty(management, propertyClass, propertyKey, ENTITY_TYPE_PROPERTY_KEY, SINGLE);
     }
 
-    private void createExactMatchIndexWithSystemProperty(AtlasGraphManagement management,
-            Class propertyClass, AtlasPropertyKey propertyKey, final String systemPropertyKey,
-            AtlasCardinality cardinality) {
+    private void createVertexCompositeIndexWithSuperTypeName(AtlasGraphManagement management, Class propertyClass, AtlasPropertyKey propertyKey) {
+        createVertexCompositeIndexWithSystemProperty(management, propertyClass, propertyKey, SUPER_TYPES_PROPERTY_KEY, SET);
+    }
 
+    private void createVertexCompositeIndexWithSystemProperty(AtlasGraphManagement management, Class propertyClass, AtlasPropertyKey propertyKey,
+                                                              final String systemPropertyKey, AtlasCardinality cardinality) {
         if (LOG.isDebugEnabled()) {
-            LOG.debug("Creating composite index for property {} of type {} and {}", propertyKey.getName(), propertyClass.getName(),
-                    systemPropertyKey);
+            LOG.debug("Creating composite index for property {} of type {} and {}", propertyKey.getName(), propertyClass.getName(),  systemPropertyKey);
         }
 
         AtlasPropertyKey typePropertyKey = management.getPropertyKey(systemPropertyKey);
@@ -526,33 +584,16 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
             List<AtlasPropertyKey> keys = new ArrayList<>(2);
             keys.add(propertyKey);
             keys.add(typePropertyKey);
-            management.createExactMatchIndex(indexName, false, keys);
-
-            LOG.info("Created composite index for property {} of type {} and {}", propertyKey.getName(), propertyClass.getName(),
-                    systemPropertyKey);
-        }
-    }
-
-    private void updateVertexIndex(AtlasGraphManagement management, String propertyName, Class propertyClass,
-            AtlasCardinality cardinality, AtlasPropertyKey propertyKey) {
-        if (checkIfVertexIndexApplicable(propertyClass, cardinality)) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Creating backing index for property {} of type {} ", propertyName, propertyClass.getName());
-            }
+            management.createVertexCompositeIndex(indexName, false, keys);
 
-            // Use backing index
-            management.addVertexIndexKey(Constants.VERTEX_INDEX, propertyKey);
-
-            LOG.info("Created backing index for property {} of type {} ", propertyName, propertyClass.getName());
+            LOG.info("Created composite index for property {} of type {} and {}", propertyKey.getName(), propertyClass.getName(), systemPropertyKey);
         }
     }
 
-    private boolean checkIfVertexIndexApplicable(Class propertyClass, AtlasCardinality cardinality) {
-        return !(VERTEX_INDEX_EXCLUSIONS.contains(propertyClass) || cardinality.isMany());
+    private boolean isIndexApplicable(Class propertyClass, AtlasCardinality cardinality) {
+        return !(INDEX_EXCLUSION_CLASSES.contains(propertyClass) || cardinality.isMany());
     }
     
-
-
     private void commit(AtlasGraphManagement management) throws IndexException {
         try {
             management.commit();

http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java b/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
index 8c88610..4d2b284 100755
--- a/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
+++ b/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
@@ -591,7 +591,7 @@ public final class GraphHelper {
         AtlasEdge ret;
 
         try {
-            ret = findEdge(Constants.GUID_PROPERTY_KEY, guid);
+            ret = findEdge(Constants.RELATIONSHIP_GUID_PROPERTY_KEY, guid);
         } catch (EntityNotFoundException e) {
             throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIP_GUID_NOT_FOUND, guid);
         }

http://git-wip-us.apache.org/repos/asf/atlas/blob/37b27107/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipStoreV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipStoreV1.java
index cf414bf..1cada0b 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipStoreV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipStoreV1.java
@@ -423,7 +423,7 @@ public class AtlasRelationshipStoreV1 implements AtlasRelationshipStore {
             final String guid = UUID.randomUUID().toString();
 
             AtlasGraphUtilsV1.setProperty(ret, Constants.ENTITY_TYPE_PROPERTY_KEY, relationship.getTypeName());
-            AtlasGraphUtilsV1.setProperty(ret, Constants.GUID_PROPERTY_KEY, guid);
+            AtlasGraphUtilsV1.setProperty(ret, Constants.RELATIONSHIP_GUID_PROPERTY_KEY, guid);
             AtlasGraphUtilsV1.setProperty(ret, Constants.VERSION_PROPERTY_KEY, getRelationshipVersion(relationship));
             AtlasGraphUtilsV1.setProperty(ret, Constants.RELATIONSHIPTYPE_TAG_PROPAGATION_KEY, tagPropagation.name());
         }