chore: fix TinkerPop unit test (#2055)

* chore: don't support persistence for memory backend
* chore: setup graph by first step graph when graph is null
* chore: apply relations optimize logic
* chore: don't support null properties
* fix: g.V().has(empty).count() and g.V().count().as('a').select('a')
* fix: specify the code generation directory for raft.proto (#2057)
* fix: tinkerpop unit schema no define
* fix the style & clean some outdated code

Co-authored-by: Simon Cheung <ming@apache.org>
Co-authored-by: imbajin <jin@apache.org>
This commit is contained in:
vaughn 2022-12-26 22:41:46 +08:00 committed by GitHub
parent fc27f2c200
commit 6c3170c496
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 174 additions and 85 deletions

View File

@ -17,20 +17,20 @@ jobs:
distribution: 'zulu'
- name: Cache Maven packages
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Package
run: |
mvn clean package -DskipTests
mvn clean package -DskipTests -ntp
- name: Rename file
if: contains(env.TAG_NAME, "-")

View File

@ -37,7 +37,7 @@ jobs:
distribution: 'zulu'
- name: Cache Maven packages
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
@ -68,18 +68,6 @@ jobs:
java-version: ${{ matrix.JAVA_VERSION }}
distribution: 'zulu'
# - name: Init MySQL Env
# if: ${{ env.BACKEND == 'mysql' }}
# uses: mirromutth/mysql-action@v1.1
# with:
# host port: 3306 # Optional, default value is 3306. The port of host
# container port: 3306 # Optional, default value is 3306. The port of container
# character set server: 'utf8mb4' # Optional, default value is 'utf8mb4'. The '--character-set-server' option for mysqld
# collation server: 'utf8mb4_general_ci' # Optional, default value is 'utf8mb4_general_ci'. The '--collation-server' option for mysqld
# mysql version: '5.7' # Optional, default value is "latest". The version of the MySQL
# mysql database: 'test' # Optional, default value is "test". The specified database which will be create
# mysql root password: "******" # Required if "mysql user" is empty, default is empty. The root superuser password
- name: Run unit test
run: |
$TRAVIS_DIR/run-unit-test.sh $BACKEND

View File

@ -193,8 +193,6 @@ public class StandardHugeGraph implements HugeGraph {
this.taskManager = TaskManager.instance();
this.features = new HugeFeatures(this, true);
this.name = config.get(CoreOptions.STORE);
this.started = false;
this.closed = false;
@ -214,6 +212,8 @@ public class StandardHugeGraph implements HugeGraph {
try {
this.tx = new TinkerPopTransaction(this);
boolean supportsPersistence = this.backendStoreFeatures().supportsPersistence();
this.features = new HugeFeatures(this, supportsPersistence);
SnowflakeIdGenerator.init(this.params);

View File

@ -35,13 +35,14 @@ import org.apache.hugegraph.type.define.HugeKeys;
import org.apache.hugegraph.util.E;
import org.apache.hugegraph.util.InsertionOrderUtil;
import org.apache.hugegraph.util.NumericUtil;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
public final class ConditionQueryFlatten {
private static final Set<HugeKeys> SPECIAL_KEYS = ImmutableSet.of(
HugeKeys.LABEL
HugeKeys.LABEL
);
public static List<ConditionQuery> flatten(ConditionQuery query) {
@ -51,7 +52,7 @@ public final class ConditionQueryFlatten {
public static List<ConditionQuery> flatten(ConditionQuery query,
boolean supportIn) {
if (query.isFlattened() && !query.mayHasDupKeys(SPECIAL_KEYS)) {
return ImmutableList.of(query);
return flattenRelations(query);
}
List<ConditionQuery> queries = new ArrayList<>();
@ -123,8 +124,8 @@ public final class ConditionQueryFlatten {
return new Condition.Or(flattenIn(or.left(), supportIn),
flattenIn(or.right(), supportIn));
default:
throw new AssertionError(String.format(
"Wrong condition type: '%s'", condition.type()));
throw new AssertionError(String.format("Wrong condition type: '%s'",
condition.type()));
}
}
@ -144,8 +145,7 @@ public final class ConditionQueryFlatten {
(key == HugeKeys.OWNER_VERTEX || key == HugeKeys.ID)) {
// TODO: Should not rely on HugeKeys here, improve key judgment
// Just mark flatten
return new Condition.FlattenSyspropRelation(
(SyspropRelation) relation);
return new Condition.FlattenSyspropRelation((SyspropRelation) relation);
}
// Do IN flatten, return null if values.size() == 0
@ -214,8 +214,8 @@ public final class ConditionQueryFlatten {
flattenAndOr(or.right()));
break;
default:
throw new AssertionError(String.format(
"Wrong condition type: '%s'", condition.type()));
throw new AssertionError(String.format("Wrong condition type: '%s'",
condition.type()));
}
return result;
}
@ -251,6 +251,25 @@ public final class ConditionQueryFlatten {
return cq;
}
private static List<ConditionQuery> flattenRelations(ConditionQuery query) {
Relations relations = new Relations();
List<Condition> nonRelations = new ArrayList<>();
for (Condition condition : query.conditions()) {
if (condition.isRelation()) {
relations.add((Relation) condition);
} else {
nonRelations.add(condition);
}
}
relations = optimizeRelations(relations);
if (relations != null) {
ConditionQuery cq = newQueryFromRelations(query, relations);
cq.query(nonRelations);
return ImmutableList.of(cq);
}
return ImmutableList.of(query);
}
private static Relations optimizeRelations(Relations relations) {
// Optimize and-relations in one query
// e.g. (age>1 and age>2) -> (age>2)
@ -289,8 +308,9 @@ public final class ConditionQueryFlatten {
/**
* Reduce and merge relations linked with 'AND' for same key
* @param relations linked with 'AND' having same key, may contains 'in',
* 'not in', '>', '<', '>=', '<=', '==', '!='
*
* @param relations linked with 'AND' having same key, may contain 'in', 'not in',
* '>', '<', '>=', '<=', '==', '!='
* @return merged relations
*/
private static Relations mergeRelations(Relations relations) {
@ -410,8 +430,8 @@ public final class ConditionQueryFlatten {
return true;
}
return compare(low, high) < 0 || compare(low, high) == 0 &&
low.relation() == Condition.RelationType.GTE &&
high.relation() == Condition.RelationType.LTE;
low.relation() == Condition.RelationType.GTE &&
high.relation() == Condition.RelationType.LTE;
}
private static boolean validEq(Relation eq, Relation low, Relation high) {
@ -460,8 +480,7 @@ public final class ConditionQueryFlatten {
return selectRelation(first, second, false);
}
private static Relation selectRelation(Relation first, Relation second,
boolean high) {
private static Relation selectRelation(Relation first, Relation second, boolean high) {
if (first == null) {
return second;
}
@ -491,8 +510,8 @@ public final class ConditionQueryFlatten {
} else if (firstValue instanceof Date && secondValue instanceof Date) {
return ((Date) firstValue).compareTo((Date) secondValue);
} else {
throw new IllegalArgumentException(String.format(
"Can't compare between %s and %s", first, second));
throw new IllegalArgumentException(String.format("Can't compare between %s and %s",
first, second));
}
}

View File

@ -271,6 +271,11 @@ public class HugeFeatures implements Graph.Features {
return VertexProperty.Cardinality.single;
}
@Override
public boolean supportsNullPropertyValues() {
return false;
}
public boolean supportsDefaultLabel() {
return true;
}
@ -291,6 +296,11 @@ public class HugeFeatures implements Graph.Features {
public EdgePropertyFeatures properties() {
return this.edgePropertyFeatures;
}
@Override
public boolean supportsNullPropertyValues() {
return false;
}
}
public class HugeDataTypeFeatures implements DataTypeFeatures {

View File

@ -104,6 +104,7 @@ public final class HugeCountStepStrategy
graphStep.queryInfo().aggregate(Aggregate.AggregateFunc.COUNT, null);
HugeCountStep<?> countStep = new HugeCountStep<>(traversal, graphStep);
for (Step<?, ?> origin : originSteps) {
TraversalHelper.copyLabels(origin, countStep, false);
traversal.removeStep(origin);
}
traversal.addStep(0, countStep);

View File

@ -72,6 +72,10 @@ public final class HugeGraphStep<S, E extends Element>
}
protected long count() {
if (this.ids == null) {
return 0L;
}
if (this.returnsVertex()) {
return this.verticesCount();
} else {
@ -144,14 +148,13 @@ public final class HugeGraphStep<S, E extends Element>
}
private Query makeQuery(HugeGraph graph, HugeType type) {
Query query = null;
Query query;
if (this.hasContainers.isEmpty()) {
// Query all
query = new Query(type);
} else {
ConditionQuery q = new ConditionQuery(type);
query = TraversalUtil.fillConditionQuery(q, this.hasContainers,
graph);
query = TraversalUtil.fillConditionQuery(q, this.hasContainers, graph);
}
query = this.injectQueryInfo(query);
@ -198,6 +201,7 @@ public final class HugeGraphStep<S, E extends Element>
return this.lastTimeResults;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof HugeGraphStep)) {
return false;

View File

@ -54,6 +54,9 @@ public final class HugeGraphStepStrategy
List<GraphStep> steps = TraversalHelper.getStepsOfClass(
GraphStep.class, traversal);
for (GraphStep originStep : steps) {
TraversalUtil.trySetGraph(originStep,
TraversalUtil.tryGetGraph(steps.get(0)));
HugeGraphStep<?, ?> newStep = new HugeGraphStep<>(originStep);
TraversalHelper.replaceStep(originStep, newStep, traversal);

View File

@ -25,6 +25,7 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.BiPredicate;
import java.util.function.Function;
import java.util.regex.Matcher;
@ -54,6 +55,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
@ -105,12 +107,61 @@ public final class TraversalUtil {
}
public static HugeGraph tryGetGraph(Step<?, ?> step) {
Graph graph = step.getTraversal().getGraph().get();
if (graph instanceof HugeGraph) {
return (HugeGraph) graph;
// TODO: remove these EmptyGraph judgments when upgrade tinkerpop (refer-tinkerpop#1699)
Optional<Graph> graph = step.getTraversal()
.getGraph()
.filter(g -> !(g instanceof EmptyGraph));
if (!graph.isPresent()) {
TraversalParent parent = step.getTraversal().getParent();
if (parent instanceof Traversal) {
Optional<Graph> parentGraph;
parentGraph = ((Traversal<?, ?>) parent).asAdmin()
.getGraph()
.filter(g -> !(g instanceof EmptyGraph));
if (parentGraph.isPresent()) {
step.getTraversal().setGraph(parentGraph.get());
return (HugeGraph) parentGraph.get();
}
}
return null;
}
assert graph == null || graph instanceof EmptyGraph;
return null;
assert graph.get() instanceof HugeGraph;
return (HugeGraph) graph.get();
}
public static void trySetGraph(Step<?, ?> step, HugeGraph graph) {
if (graph == null || step == null || step.getTraversal() == null) {
return;
}
// TODO: remove these EmptyGraph judgments when upgrade tinkerpop (refer-tinkerpop#1699)
Optional<Graph> stepGraph = step.getTraversal()
.getGraph()
.filter(g -> !(g instanceof EmptyGraph));
if (step instanceof TraversalParent) {
for (final Traversal.Admin<?, ?> local : ((TraversalParent) step).getLocalChildren()) {
if (local.getGraph().filter(g -> !(g instanceof EmptyGraph)).isPresent()) {
continue;
}
local.setGraph(graph);
}
for (final Traversal.Admin<?, ?> global : ((TraversalParent) step).getGlobalChildren()) {
if (global.getGraph().filter(g -> !(g instanceof EmptyGraph)).isPresent()) {
continue;
}
global.setGraph(graph);
}
}
if (stepGraph.isPresent()) {
assert stepGraph.get() instanceof HugeGraph;
return;
}
step.getTraversal().setGraph(graph);
}
public static void extractHasContainer(HugeGraphStep<?, ?> newStep,
@ -154,7 +205,6 @@ public final class TraversalUtil {
step = step.getNextStep();
if (step instanceof OrderGlobalStep) {
QueryHolder holder = (QueryHolder) newStep;
@SuppressWarnings("resource")
OrderGlobalStep<?, ?> orderStep = (OrderGlobalStep<?, ?>) step;
orderStep.getComparators().forEach(comp -> {
ElementValueComparator<?> comparator =
@ -225,7 +275,6 @@ public final class TraversalUtil {
do {
step = step.getNextStep();
if (step instanceof PropertiesStep) {
@SuppressWarnings("resource")
PropertiesStep<?> propStep = (PropertiesStep<?>) step;
if (propStep.getReturnType() == PropertyType.VALUE &&
propStep.getPropertyKeys().length == 1) {
@ -580,14 +629,29 @@ public final class TraversalUtil {
List<HasStep> steps =
TraversalHelper.getStepsOfAssignableClassRecursively(
HasStep.class, traversal);
if (steps.isEmpty()) {
return;
}
/*
* The graph in traversal may be null, for example:
* `g.V().hasLabel('person').union(__.has('name', 'tom'))`
* Here `__.has()` will create a new traversal, but the graph is null
*/
if (steps.isEmpty() || !traversal.getGraph().isPresent()) {
return;
if (!traversal.getGraph().filter(g -> !(g instanceof EmptyGraph)).isPresent()) {
if (traversal.getParent() == null || !(traversal.getParent() instanceof Traversal)) {
return;
}
Optional<Graph> parentGraph = ((Traversal<?, ?>) traversal.getParent())
.asAdmin()
.getGraph();
if (parentGraph.filter(g -> !(g instanceof EmptyGraph)).isPresent()) {
traversal.setGraph(parentGraph.get());
}
}
HugeGraph graph = (HugeGraph) traversal.getGraph().get();
for (HasStep<?> step : steps) {
TraversalUtil.convHasStep(graph, step);
@ -603,7 +667,7 @@ public final class TraversalUtil {
private static void convPredicateValue(HugeGraph graph,
HasContainer has) {
// No need to convert if key is sysprop
// No need to convert if key is sys-prop
if (isSysProp(has.getKey())) {
return;
}
@ -719,8 +783,7 @@ public final class TraversalUtil {
public static void retrieveSysprop(List<HasContainer> hasContainers,
Function<HasContainer, Boolean> func) {
for (Iterator<HasContainer> iter = hasContainers.iterator();
iter.hasNext();) {
for (Iterator<HasContainer> iter = hasContainers.iterator(); iter.hasNext();) {
HasContainer container = iter.next();
if (container.getKey().startsWith("~") && func.apply(container)) {
iter.remove();

View File

@ -53,8 +53,7 @@ import com.google.common.collect.ImmutableList;
public class MultiGraphsTest extends BaseCoreTest {
private static final String NAME48 =
"g12345678901234567890123456789012345678901234567";
private static final String NAME48 = "g12345678901234567890123456789012345678901234567";
@Test
public void testWriteAndReadVersion() {
@ -233,16 +232,12 @@ public class MultiGraphsTest extends BaseCoreTest {
@Test
public void testCreateGraphsWithInvalidNames() {
List<String> invalidNames = ImmutableList.of(
"", " ", " g", "g 1", " .", ". .",
"@", "$", "%", "^", "&", "*", "(", ")",
"_", "+", "`", "-", "=", "{", "}", "|",
"[", "]", "\"", "<", "?", ";", "'", "~",
",", ".", "/", "\\",
"~g", "g~", "g'",
"_1", "_a",
"1a", "123",
NAME48 + "8");
List<String> invalidNames = ImmutableList.of("", " ", " g", "g 1", " .", ". .",
"@", "$", "%", "^", "&", "*", "(", ")",
"_", "+", "`", "-", "=", "{", "}", "|",
"[", "]", "\"", "<", "?", ";", "'", "~",
",", ".", "/", "\\", "~g", "g~", "g'",
"_1", "_a", "1a", "123", NAME48 + "8");
for (String name : invalidNames) {
Assert.assertThrows(RuntimeException.class, () -> openGraphs(name));
}
@ -267,8 +262,7 @@ public class MultiGraphsTest extends BaseCoreTest {
() -> g2.vertexLabel("node"));
Assert.assertThrows(IllegalArgumentException.class,
() -> g3.vertexLabel("node"));
g1.schema().vertexLabel("node").useCustomizeNumberId()
.ifNotExist().create();
g1.schema().vertexLabel("node").useCustomizeNumberId().ifNotExist().create();
g2.vertexLabel("node");
g3.vertexLabel("node");
@ -294,13 +288,11 @@ public class MultiGraphsTest extends BaseCoreTest {
}
@Test
public void testCreateGraphWithSameNameDifferentBackends()
throws Exception {
public void testCreateGraphWithSameNameDifferentBackends() throws Exception {
HugeGraph g1 = openGraphWithBackend("graph", "memory", "text");
g1.initBackend();
Assert.assertThrows(RuntimeException.class,
() -> openGraphWithBackend("graph", "rocksdb",
"binary"));
() -> openGraphWithBackend("graph", "rocksdb", "binary"));
g1.clearBackend();
g1.close();
}
@ -323,17 +315,15 @@ public class MultiGraphsTest extends BaseCoreTest {
@Test
public void testCreateGraphsWithMultiDisksForRocksDB() {
HugeGraph g1 = openGraphWithBackend(
"g1", "rocksdb", "binary",
"rocksdb.data_disks",
"[g/secondary_index:rocksdb-index1," +
" g/range_int_index:rocksdb-index1," +
" g/range_long_index:rocksdb-index2]");
HugeGraph g1 = openGraphWithBackend("g1", "rocksdb", "binary", "rocksdb.data_disks",
"[g/secondary_index:rocksdb-index1," +
" g/range_int_index:rocksdb-index1," +
" g/range_long_index:rocksdb-index2]");
g1.initBackend();
g1.clearBackend();
final HugeGraph[] g2 = new HugeGraph[1];
Assert.assertThrows(ConnectionException.class, () -> {
Assert.assertThrows(RuntimeException.class, () -> {
g2[0] = openGraphWithBackend("g2", "rocksdb", "binary",
"rocksdb.data_disks",
"[g/range_int_index:rocksdb-index1]");
@ -348,7 +338,7 @@ public class MultiGraphsTest extends BaseCoreTest {
});
final HugeGraph[] g3 = new HugeGraph[1];
Assert.assertThrows(ConnectionException.class, () -> {
Assert.assertThrows(RuntimeException.class, () -> {
g3[0] = openGraphWithBackend("g3", "rocksdb", "binary",
"rocksdb.data_disks",
"[g/secondary_index:/]");
@ -388,7 +378,7 @@ public class MultiGraphsTest extends BaseCoreTest {
Configuration config = buildConfig(graph);
config.setProperty(CoreOptions.BACKEND.name(), backend);
config.setProperty(CoreOptions.SERIALIZER.name(), serializer);
for (int i = 0; i < configs.length;) {
for (int i = 0; i < configs.length; ) {
config.setProperty(configs[i++], configs[i++]);
}
return ((HugeGraph) GraphFactory.open(config));
@ -397,7 +387,7 @@ public class MultiGraphsTest extends BaseCoreTest {
private static Configuration buildConfig(String graphName) {
PropertiesConfiguration conf = Utils.getConf();
Configuration config = new BaseConfiguration();
for (Iterator<String> keys = conf.getKeys(); keys.hasNext();) {
for (Iterator<String> keys = conf.getKeys(); keys.hasNext(); ) {
String key = keys.next();
config.setProperty(key, conf.getProperty(key));
}

View File

@ -457,6 +457,7 @@ public class TestGraph implements Graph {
schema.propertyKey("ripple").ifNotExist().create();
schema.propertyKey("lop").ifNotExist().create();
schema.propertyKey("test").ifNotExist().create();
schema.propertyKey("p").ifNotExist().create();
switch (idStrategy) {
case AUTOMATIC:
@ -475,8 +476,8 @@ public class TestGraph implements Graph {
.nullableKeys("name")
.ifNotExist().create();
schema.vertexLabel(DEFAULT_VL)
.properties("name", "age")
.nullableKeys("name", "age")
.properties("name", "age", "p")
.nullableKeys("name", "age", "p")
.ifNotExist().create();
schema.vertexLabel("animal")
.properties("name", "age", "peter", "josh", "marko",
@ -499,8 +500,8 @@ public class TestGraph implements Graph {
.nullableKeys("name")
.useCustomizeStringId().ifNotExist().create();
schema.vertexLabel(DEFAULT_VL)
.properties("name", "age")
.nullableKeys("name", "age")
.properties("name", "age", "p")
.nullableKeys("name", "age", "p")
.useCustomizeStringId().ifNotExist().create();
schema.vertexLabel("animal")
.properties("name", "age")
@ -557,6 +558,8 @@ public class TestGraph implements Graph {
.range().ifNotExist().create();
schema.indexLabel("personByNameAge").onV("person").by("name", "age")
.ifNotExist().create();
schema.indexLabel("vertexByP").onV("vertex").by("p")
.ifNotExist().create();
}
@Watched
@ -659,6 +662,8 @@ public class TestGraph implements Graph {
schema.propertyKey("f").asFloat().ifNotExist().create();
schema.propertyKey("i").asInt().ifNotExist().create();
schema.propertyKey("l").asLong().ifNotExist().create();
schema.propertyKey("p").ifNotExist().create();
schema.propertyKey("k").ifNotExist().create();
schema.propertyKey("here").ifNotExist().create();
schema.propertyKey("to-change").ifNotExist().create();
schema.propertyKey("to-remove").ifNotExist().create();
@ -704,7 +709,7 @@ public class TestGraph implements Graph {
"favoriteColor", "aKey", "age", "boolean",
"float", "double", "string", "integer",
"long", "myId", "location", "x", "y", "s",
"n", "d", "f", "i", "l", "to-change",
"n", "d", "f", "i", "l", "p", "k", "to-change",
"to-remove", "to-keep", "old", "new",
"gremlin.partitionGraphStrategy.partition",
"color", "blah")
@ -714,7 +719,7 @@ public class TestGraph implements Graph {
"favoriteColor", "aKey", "age", "boolean",
"float", "double", "string", "integer",
"long", "myId", "location", "x", "y", "s",
"n", "d", "f", "i", "l", "to-change",
"n", "d", "f", "i", "l", "p", "k", "to-change",
"to-remove", "to-keep", "old", "new",
"gremlin.partitionGraphStrategy.partition",
"color", "blah")
@ -729,7 +734,7 @@ public class TestGraph implements Graph {
"favoriteColor", "aKey", "age", "boolean",
"float", "double", "string", "integer",
"long", "myId", "location", "x", "y", "s",
"n", "d", "f", "i", "l", "to-change",
"n", "d", "f", "i", "l", "p", "k", "to-change",
"to-remove", "to-keep", "old", "new",
"gremlin.partitionGraphStrategy.partition",
"color", "blah")
@ -739,7 +744,7 @@ public class TestGraph implements Graph {
"favoriteColor", "aKey", "age", "boolean",
"float", "double", "string", "integer",
"long", "myId", "location", "x", "y", "s",
"n", "d", "f", "i", "l", "to-change",
"n", "d", "f", "i", "l", "p", "k", "to-change",
"to-remove", "to-keep", "old", "new",
"gremlin.partitionGraphStrategy.partition",
"color", "blah")
@ -754,6 +759,10 @@ public class TestGraph implements Graph {
.ifNotExist().create();
schema.indexLabel("defaultVLByName").onV(defaultVL).by("name")
.ifNotExist().create();
schema.indexLabel("defaultVLBySome").onV(defaultVL).by("some")
.ifNotExist().create();
schema.indexLabel("defaultVLByK").onV(defaultVL).by("k")
.ifNotExist().create();
}
@Watched

View File

@ -165,6 +165,7 @@ org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXname_not_endingWithXasXX: Unsupported predicate 'notEndingWith(as)'
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXage_withoutX27_29X_count: Unsupported relation 'NEQ'
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXname_gtXmX_andXcontainingXoXXX: Unsupported predicate 'containing(o)'
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.g_V_hasXp_neqXvXX: Unsupported relation 'NEQ'
# Unsupport edge label 'created': 'software' -> 'person', has existed an edgelabel (created: person -> software) in this case
org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeTest.Traversals.g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX: Unsupport edge from inV to outV

View File

@ -128,6 +128,7 @@ org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXname_not_endingWithXasXX: Unsupported predicate 'notEndingWith(as)'
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXage_withoutX27_29X_count: Unsupported relation 'NEQ'
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXname_gtXmX_andXcontainingXoXXX: Unsupported predicate 'containing(o)'
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.g_V_hasXp_neqXvXX: Unsupported relation 'NEQ'
# Unsupport edge label 'created': 'software' -> 'person', has existed an edgelabel (created: person -> software) in this case
org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeTest.Traversals.g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX: Unsupport edge from inV to outV