public class StaleIndexRecordUtil extends Object
In case more complicated index record modifications are needed, for example a case when a stale index have missing added elements to the graph then it's possible to manually add or remove any index records of the index. To do so you will need to use `BackendTransaction` directly. Below is an example of direct `BackendTransaction` usage.
Vertex index record update:
StandardJanusGraph graph = (StandardJanusGraph) JanusGraphFactory.open(configuration); StandardJanusGraphTx tx = (StandardJanusGraphTx) graph.newTransaction(); ManagementSystem mgmt = (ManagementSystem) graph.openManagement(); // Let's say we want to remove non-existent vertex from a stale index. // We will assume the next constraints: // vertex id is 12345; // Composite index name is: nameIndex // There is a single indexed property: name // Value of the vertex property is: HelloWorld long vertexId = 12345L; String compositeIndexName = "nameIndex"; String propertyKeyName = "name"; String value = "HelloWorld"; PropertyKey propertyKey = mgmt.getPropertyKey(propertyKeyName); long propertyKeyId = propertyKey.longId(); IndexRecordEntry namePropertyIndexRecord = new IndexRecordEntry(propertyKeyId, value, propertyKey); IndexRecordEntry[] fullIndexRecord = new IndexRecordEntry[]{namePropertyIndexRecord}; JanusGraphElement elementToBeRemoved = new CacheVertex(tx, vertexId, ElementLifeCycle.New); JanusGraphIndex indexToBeUpdated = managementSystem.getGraphIndex(compositeIndexName); JanusGraphSchemaVertex indexSchemaVertex = managementSystem.getSchemaVertex(indexToBeUpdated); CompositeIndexType compositeIndexTypeToBeUpdated = (CompositeIndexType) indexSchemaVertex.asIndexType(); Serializer serializer = graph.getDataSerializer(); boolean hashKeys = graph.getIndexSerializer().isHashKeys(); HashingUtil.HashLength hashLength = graph.getIndexSerializer().getHashLength(); IndexUpdate<StaticBuffer, Entry> update = IndexRecordUtil.getCompositeIndexUpdate( compositeIndexTypeToBeUpdated, IndexMutationType.DELETE, fullIndexRecord, elementToBeRemoved, serializer, hashKeys, hashLength ); BackendTransaction backendTransaction = tx.getTxHandle(); backendTransaction.mutateIndex(update.getKey(), Collections.emptyList(), Collections.singletonList(update.getEntry())); transaction.commit(); tx.commit(); mgmt.rollback();In case above you wanted to add index entry instead of removing it you would need to use
IndexMutationType.ADD
instead
of IndexMutationType.DELETE
as provide entries collection as a second parameter into
mutateIndex
method instead of third parameter.
I.e. backendTransaction.mutateIndex(update.getKey(), Collections.emptyList(), Collections.singletonList(update.getEntry()));
Edge index record update is currently more limited to Vertex index record update above as you will need to find `relationId` as well as both ids of the connected vertices. It may be more challenging in case you don't have those elements in the graph. Thus, below example shows how to remove index record of *existing* edge which leads to stale index. You shouldn't repeat below steps unless you want to force remove existing edge index record.
StandardJanusGraph graph = (StandardJanusGraph) JanusGraphFactory.open(configuration); StandardJanusGraphTx tx = (StandardJanusGraphTx) graph.newTransaction(); ManagementSystem mgmt = (ManagementSystem) graph.openManagement(); // Let's say we want to remove existent edge from an index. // We will assume the next constraints: // Composite index name is: nameIndex // There is a single indexed property: name // Value of the vertex property is: HelloWorld String compositeIndexName = "nameIndex"; String propertyKeyName = "name"; String value = "HelloWorld"; PropertyKey propertyKey = mgmt.getPropertyKey(propertyKeyName); Edge edge = tx.traversal().E().has(propertyKeyName, value).next(); RelationIdentifier relationIdentifier = (RelationIdentifier) edge.id(); long relationId = relationIdentifier.getRelationId(); EdgeLabel edgeLabel = managementSystem.getEdgeLabel(edgeName); IndexRecordEntry[] fullIndexRecord = new IndexRecordEntry[]{new IndexRecordEntry(relationId, value, propertyKey)}; InternalVertex internalVertex1 = (InternalVertex) edge.outVertex(); InternalVertex internalVertex2 = (InternalVertex) edge.inVertex(); JanusGraphElement elementToBeRemoved = new StandardEdge(relationId, edgeLabel, internalVertex1, internalVertex2, ElementLifeCycle.New); JanusGraphIndex indexToBeUpdated = managementSystem.getGraphIndex(compositeIndexName); JanusGraphSchemaVertex indexSchemaVertex = managementSystem.getSchemaVertex(indexToBeUpdated); CompositeIndexType compositeIndexTypeToBeUpdated = (CompositeIndexType) indexSchemaVertex.asIndexType(); Serializer serializer = graph.getDataSerializer(); boolean hashKeys = graph.getIndexSerializer().isHashKeys(); HashingUtil.HashLength hashLength = graph.getIndexSerializer().getHashLength(); IndexUpdate<StaticBuffer, Entry> update = IndexRecordUtil.getCompositeIndexUpdate( compositeIndexTypeToBeUpdated, IndexMutationType.DELETE, fullIndexRecord, elementToBeRemoved, serializer, hashKeys, hashLength ); BackendTransaction backendTransaction = tx.getTxHandle(); backendTransaction.mutateIndex(update.getKey(), Collections.emptyList(), Collections.singletonList(update.getEntry())); transaction.commit(); tx.commit(); mgmt.rollback();
Constructor and Description |
---|
StaleIndexRecordUtil() |
Modifier and Type | Method and Description |
---|---|
static void |
forceRemoveElementFromGraphIndex(JanusGraphElement elementToRemoveFromIndex,
IndexRecordEntry[] indexRecord,
StandardJanusGraph graph,
String graphIndexName)
Force removes element record from a graph index.
|
static void |
forceRemoveElementFromMixedIndex(Object elementId,
IndexRecordEntry[] indexRecord,
JanusGraph graph,
String mixedIndexName)
Force removes element record from a mixed index.
|
static void |
forceRemoveElementFromMixedIndex(Object elementId,
JanusGraph graph,
String mixedIndexName)
Force removes element fully from a mixed index.
|
static void |
forceRemoveElementFromMixedIndex(Object elementId,
Map<String,Object> indexRecordPropertyValues,
JanusGraph graph,
String mixedIndexName)
Force removes element record from a mixed index.
|
static void |
forceRemoveVertexFromGraphIndex(Object vertexId,
Map<String,Object> indexRecordPropertyValues,
JanusGraph graph,
String graphIndexName)
Force removes vertex record from a graph index.
|
public static void forceRemoveVertexFromGraphIndex(Object vertexId, Map<String,Object> indexRecordPropertyValues, JanusGraph graph, String graphIndexName) throws BackendException
vertexId
- the vertex which should be removed from a specified indexindexRecordPropertyValues
- all property values of the index recordgraph
- JanusGraph instance to be used to open graph management and new backend transaction for index removal.graphIndexName
- name of the graph index for which to remove a recordBackendException
- is thrown in case backend transaction cannot be mutated for any reason.public static void forceRemoveElementFromGraphIndex(JanusGraphElement elementToRemoveFromIndex, IndexRecordEntry[] indexRecord, StandardJanusGraph graph, String graphIndexName) throws BackendException
An example of using this method is below:
StandardJanusGraph graph = (StandardJanusGraph) JanusGraphFactory.open(configuration); StandardJanusGraphTx tx = (StandardJanusGraphTx) graph.newTransaction(); JanusGraphManagement mgmt = graph.openManagement(); // Let's say we want to remove non-existent vertex from a stale index. // We will assume the next constraints: // vertex id is 12345; // Composite index name is: nameIndex // There is a single indexed property: name // Value of the vertex property is: HelloWorld long vertexId = 12345L; String compositeIndexName = "nameIndex"; String propertyKeyName = "name"; String value = "HelloWorld"; PropertyKey propertyKey = mgmt.getPropertyKey(propertyKeyName); long propertyKeyId = propertyKey.longId(); IndexRecordEntry namePropertyIndexRecord = new IndexRecordEntry(propertyKeyId, value, propertyKey); IndexRecordEntry[] fullIndexRecord = new IndexRecordEntry[]{namePropertyIndexRecord}; JanusGraphElement elementToBeRemoved = new CacheVertex(tx, vertexId, ElementLifeCycle.New); // After the below method is executed index entry of the vertex 12345 should be removed from the index which // effectively fixes permanent stale index inconsistency StaleIndexRecordUtil.forceRemoveElementFromGraphIndex( elementToBeRemoved, fullIndexRecord, graph, compositeIndexName ); tx.commit(); mgmt.rollback();
elementToRemoveFromIndex
- an element which should be removed.indexRecord
- an ordered array or index record properties which represent this index record.graph
- JanusGraph instance to be used to open graph management and new backend transaction for index removal.graphIndexName
- index name of the graph index for which to delete a specified indexRecord.BackendException
- is thrown in case backend transaction cannot be mutated for any reason.public static void forceRemoveElementFromMixedIndex(Object elementId, Map<String,Object> indexRecordPropertyValues, JanusGraph graph, String mixedIndexName) throws BackendException
elementId
- id of the element which should be removed from a specified indexindexRecordPropertyValues
- all property values of the index recordgraph
- JanusGraph instance to be used to open graph management and new backend transaction for index removal.mixedIndexName
- name of the mixed index for which to remove a recordBackendException
- is thrown in case backend transaction cannot be mutated for any reason.public static void forceRemoveElementFromMixedIndex(Object elementId, IndexRecordEntry[] indexRecord, JanusGraph graph, String mixedIndexName) throws BackendException
elementId
- id of the element which should be removed from a specified indexindexRecord
- an unordered array or index record properties which represent this index record.graph
- JanusGraph instance to be used to open graph management and new backend transaction for index removal.mixedIndexName
- name of the mixed index for which to remove a recordBackendException
- is thrown in case backend transaction cannot be mutated for any reason.public static void forceRemoveElementFromMixedIndex(Object elementId, JanusGraph graph, String mixedIndexName) throws BackendException
elementId
- id of the element which should be removed from a specified indexgraph
- JanusGraph instance to be used to open graph management and new backend transaction for index removal.mixedIndexName
- name of the mixed index for which to remove a recordBackendException
- is thrown in case backend transaction cannot be mutated for any reason.Copyright © 2012–2024. All rights reserved.