This is an automated email from the ASF dual-hosted git repository.
zhaocong pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/incubator-hugegraph-toolchain.git
The following commit(s) were added to refs/heads/master by this push:
new b7095aab feat(client): support edgeExistence api (#544)
b7095aab is described below
commit b7095aabab0947fb90b946e0cabb2be200aa658f
Author: M <[email protected]>
AuthorDate: Tue Dec 12 15:53:57 2023 +0800
feat(client): support edgeExistence api (#544)
---
.github/workflows/client-ci.yml | 3 +-
.github/workflows/client-go-ci.yml | 3 +-
.github/workflows/hubble-ci.yml | 4 +-
.github/workflows/loader-ci.yml | 3 +-
.github/workflows/tools-ci.yml | 3 +-
.../hugegraph/api/traverser/EdgeExistenceAPI.java | 59 ++++++++++++++++++
.../apache/hugegraph/driver/TraverserManager.java | 60 ++++++++++++-------
.../org/apache/hugegraph/api/ApiTestSuite.java | 2 +
.../java/org/apache/hugegraph/api/BaseApiTest.java | 8 +--
.../api/traverser/EdgeExistenceAPITest.java | 70 ++++++++++++++++++++++
.../hugegraph/api/traverser/TraverserApiTest.java | 3 +
11 files changed, 186 insertions(+), 32 deletions(-)
diff --git a/.github/workflows/client-ci.yml b/.github/workflows/client-ci.yml
index ee5e9562..7ba285c3 100644
--- a/.github/workflows/client-ci.yml
+++ b/.github/workflows/client-ci.yml
@@ -24,7 +24,8 @@ jobs:
env:
USE_STAGE: 'true' # Whether to include the stage repository.
TRAVIS_DIR: hugegraph-client/assembly/travis
- COMMIT_ID: bfe9fae150446857412db23ada0dae9d05035837
+ # TODO: replace it with the (latest - n) commit id (n >= 15)
+ COMMIT_ID: b52517c
strategy:
fail-fast: false
matrix:
diff --git a/.github/workflows/client-go-ci.yml
b/.github/workflows/client-go-ci.yml
index 2a941a0d..b29b6304 100644
--- a/.github/workflows/client-go-ci.yml
+++ b/.github/workflows/client-go-ci.yml
@@ -23,7 +23,8 @@ jobs:
env:
USE_STAGE: 'true' # Whether to include the stage repository.
TRAVIS_DIR: hugegraph-client/assembly/travis
- COMMIT_ID: bfe9fae150446857412db23ada0dae9d05035837
+ # TODO: replace it with the (latest - n) commit id (n >= 15)
+ COMMIT_ID: b52517c
strategy:
fail-fast: false
matrix:
diff --git a/.github/workflows/hubble-ci.yml b/.github/workflows/hubble-ci.yml
index d88c6509..35016394 100644
--- a/.github/workflows/hubble-ci.yml
+++ b/.github/workflows/hubble-ci.yml
@@ -23,8 +23,8 @@ on:
env:
TRAVIS_DIR: hugegraph-hubble/hubble-dist/assembly/travis
- # TODO: need update it later (eed6103359fe40d2f1476fb8c56d9388c3111a99)
- COMMIT_ID: bfe9fae150446857412db23ada0dae9d05035837
+ # TODO: replace it with the (latest - n) commit id (n >= 15)
+ COMMIT_ID: b52517c
jobs:
hubble-ci:
diff --git a/.github/workflows/loader-ci.yml b/.github/workflows/loader-ci.yml
index 70849b52..c983eee5 100644
--- a/.github/workflows/loader-ci.yml
+++ b/.github/workflows/loader-ci.yml
@@ -26,7 +26,8 @@ jobs:
USE_STAGE: 'true' # Whether to include the stage repository.
TRAVIS_DIR: hugegraph-loader/assembly/travis
STATIC_DIR: hugegraph-loader/assembly/static
- COMMIT_ID: bfe9fae150446857412db23ada0dae9d05035837
+ # TODO: replace it with the (latest - n) commit id (n >= 15)
+ COMMIT_ID: b52517c
DB_USER: root
DB_PASS: root
DB_DATABASE: load_test
diff --git a/.github/workflows/tools-ci.yml b/.github/workflows/tools-ci.yml
index ea4756d7..ac0673d8 100644
--- a/.github/workflows/tools-ci.yml
+++ b/.github/workflows/tools-ci.yml
@@ -25,7 +25,8 @@ jobs:
USE_STAGE: 'true' # Whether to include the stage repository.
TRAVIS_DIR: hugegraph-tools/assembly/travis
# TODO: could we use one param to unify it? or use a action template
(could use one ci file)
- COMMIT_ID: bfe9fae150446857412db23ada0dae9d05035837
+ # TODO: replace it with the (latest - n) commit id (n >= 15)
+ COMMIT_ID: b52517c
steps:
- name: Install JDK 11
uses: actions/setup-java@v3
diff --git
a/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/EdgeExistenceAPI.java
b/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/EdgeExistenceAPI.java
new file mode 100644
index 00000000..a62a7972
--- /dev/null
+++
b/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/EdgeExistenceAPI.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hugegraph.api.traverser;
+
+
+import org.apache.hugegraph.api.graph.GraphAPI;
+import org.apache.hugegraph.client.RestClient;
+import org.apache.hugegraph.rest.RestResult;
+import org.apache.hugegraph.structure.graph.Edge;
+import org.apache.logging.log4j.util.Strings;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class EdgeExistenceAPI extends TraversersAPI {
+
+ public EdgeExistenceAPI(RestClient client, String graph) {
+ super(client, graph);
+ }
+
+ @Override
+ protected String type() {
+ return "edgeexist";
+ }
+
+ public List<Edge> get(Object sourceId, Object targetId, String edgeLabel,
+ String sortValues, int limit) {
+ this.client.checkApiVersion("0.70", "count");
+ String source = GraphAPI.formatVertexId(sourceId, false);
+ String target = GraphAPI.formatVertexId(targetId, false);
+
+ Map<String, Object> params = new LinkedHashMap<>();
+ params.put("source", source);
+ params.put("target", target);
+ params.put("label", edgeLabel);
+ if (!Strings.isEmpty(sortValues)) {
+ params.put("sort_values", sortValues);
+ }
+ params.put("limit", limit);
+ RestResult result = this.client.get(this.path(), params);
+ return result.readList("edges", Edge.class);
+ }
+}
diff --git
a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/TraverserManager.java
b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/TraverserManager.java
index 3d9d1208..58081342 100644
---
a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/TraverserManager.java
+++
b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/TraverserManager.java
@@ -42,6 +42,7 @@ import
org.apache.hugegraph.api.traverser.SingleSourceShortestPathAPI;
import org.apache.hugegraph.api.traverser.TemplatePathsAPI;
import org.apache.hugegraph.api.traverser.VerticesAPI;
import org.apache.hugegraph.api.traverser.WeightedShortestPathAPI;
+import org.apache.hugegraph.api.traverser.EdgeExistenceAPI;
import org.apache.hugegraph.client.RestClient;
import org.apache.hugegraph.structure.constant.Direction;
import org.apache.hugegraph.structure.constant.Traverser;
@@ -76,28 +77,29 @@ import org.apache.hugegraph.util.E;
public class TraverserManager {
private final GraphManager graphManager;
- private JaccardSimilarityAPI jaccardSimilarityAPI;
- private SameNeighborsAPI sameNeighborsAPI;
- private ShortestPathAPI shortestPathAPI;
- private AllShortestPathsAPI allShortestPathsAPI;
- private SingleSourceShortestPathAPI singleSourceShortestPathAPI;
- private WeightedShortestPathAPI weightedShortestPathAPI;
- private MultiNodeShortestPathAPI multiNodeShortestPathAPI;
- private PathsAPI pathsAPI;
- private CrosspointsAPI crosspointsAPI;
- private KoutAPI koutAPI;
- private KneighborAPI kneighborAPI;
- private CountAPI countAPI;
- private RingsAPI ringsAPI;
- private RaysAPI raysAPI;
- private CustomizedPathsAPI customizedPathsAPI;
- private CustomizedCrosspointsAPI customizedCrosspointsAPI;
- private TemplatePathsAPI templatePathsAPI;
- private FusiformSimilarityAPI fusiformSimilarityAPI;
- private NeighborRankAPI neighborRankAPI;
- private PersonalRankAPI personalRankAPI;
- private VerticesAPI verticesAPI;
- private EdgesAPI edgesAPI;
+ private final JaccardSimilarityAPI jaccardSimilarityAPI;
+ private final SameNeighborsAPI sameNeighborsAPI;
+ private final ShortestPathAPI shortestPathAPI;
+ private final AllShortestPathsAPI allShortestPathsAPI;
+ private final SingleSourceShortestPathAPI singleSourceShortestPathAPI;
+ private final WeightedShortestPathAPI weightedShortestPathAPI;
+ private final MultiNodeShortestPathAPI multiNodeShortestPathAPI;
+ private final PathsAPI pathsAPI;
+ private final CrosspointsAPI crosspointsAPI;
+ private final KoutAPI koutAPI;
+ private final KneighborAPI kneighborAPI;
+ private final CountAPI countAPI;
+ private final RingsAPI ringsAPI;
+ private final RaysAPI raysAPI;
+ private final CustomizedPathsAPI customizedPathsAPI;
+ private final CustomizedCrosspointsAPI customizedCrosspointsAPI;
+ private final TemplatePathsAPI templatePathsAPI;
+ private final FusiformSimilarityAPI fusiformSimilarityAPI;
+ private final NeighborRankAPI neighborRankAPI;
+ private final PersonalRankAPI personalRankAPI;
+ private final VerticesAPI verticesAPI;
+ private final EdgesAPI edgesAPI;
+ private final EdgeExistenceAPI edgeExistenceAPI;
public TraverserManager(RestClient client, GraphManager graphManager) {
this.graphManager = graphManager;
@@ -124,6 +126,7 @@ public class TraverserManager {
this.personalRankAPI = new PersonalRankAPI(client, graph);
this.verticesAPI = new VerticesAPI(client, graph);
this.edgesAPI = new EdgesAPI(client, graph);
+ this.edgeExistenceAPI = new EdgeExistenceAPI(client, graph);
}
public double jaccardSimilarity(Object vertexId, Object otherId) {
@@ -540,4 +543,17 @@ public class TraverserManager {
return this.edges(shard, page, sizePerPage);
});
}
+
+ public List<Edge> edgeExistence(Object sourceId, Object targetId, String
edgeLabel,
+ String sortValues, int limit) {
+ return this.edgeExistenceAPI.get(sourceId, targetId, edgeLabel,
sortValues, limit);
+ }
+
+ public List<Edge> edgeExistence(Object sourceId, Object targetId) {
+ return this.edgeExistenceAPI.get(sourceId, targetId, "", "", -1);
+ }
+
+ public List<Edge> edgeExistence(Object sourceId, Object targetId, String
edgeLabel) {
+ return this.edgeExistenceAPI.get(sourceId, targetId, edgeLabel, null,
-1);
+ }
}
diff --git
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/ApiTestSuite.java
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/ApiTestSuite.java
index 6fdb3c53..c9edba73 100644
--- a/hugegraph-client/src/test/java/org/apache/hugegraph/api/ApiTestSuite.java
+++ b/hugegraph-client/src/test/java/org/apache/hugegraph/api/ApiTestSuite.java
@@ -44,6 +44,7 @@ import org.apache.hugegraph.api.traverser.ShortestPathApiTest;
import org.apache.hugegraph.api.traverser.SingleSourceShortestPathApiTest;
import org.apache.hugegraph.api.traverser.TemplatePathsApiTest;
import org.apache.hugegraph.api.traverser.WeightedShortestPathApiTest;
+import org.apache.hugegraph.api.traverser.EdgeExistenceAPITest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@@ -84,6 +85,7 @@ import org.junit.runners.Suite;
FusiformSimilarityApiTest.class,
NeighborRankApiTest.class,
PersonalRankApiTest.class,
+ EdgeExistenceAPITest.class,
TargetApiTest.class,
GroupApiTest.class,
diff --git
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/BaseApiTest.java
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/BaseApiTest.java
index 37e88622..c6570149 100644
--- a/hugegraph-client/src/test/java/org/apache/hugegraph/api/BaseApiTest.java
+++ b/hugegraph-client/src/test/java/org/apache/hugegraph/api/BaseApiTest.java
@@ -120,25 +120,25 @@ public class BaseApiTest extends BaseClientTest {
indexLabelAPI.list().forEach(indexLabel -> {
ilTaskIds.add(indexLabelAPI.delete(indexLabel.name()));
});
- ilTaskIds.forEach(taskId -> waitUntilTaskCompleted(taskId));
+ ilTaskIds.forEach(BaseApiTest::waitUntilTaskCompleted);
List<Long> elTaskIds = new ArrayList<>();
edgeLabelAPI.list().forEach(edgeLabel -> {
elTaskIds.add(edgeLabelAPI.delete(edgeLabel.name()));
});
- elTaskIds.forEach(taskId -> waitUntilTaskCompleted(taskId));
+ elTaskIds.forEach(BaseApiTest::waitUntilTaskCompleted);
List<Long> vlTaskIds = new ArrayList<>();
vertexLabelAPI.list().forEach(vertexLabel -> {
vlTaskIds.add(vertexLabelAPI.delete(vertexLabel.name()));
});
- vlTaskIds.forEach(taskId -> waitUntilTaskCompleted(taskId));
+ vlTaskIds.forEach(BaseApiTest::waitUntilTaskCompleted);
List<Long> pkTaskIds = new ArrayList<>();
propertyKeyAPI.list().forEach(propertyKey -> {
pkTaskIds.add(propertyKeyAPI.delete(propertyKey.name()));
});
- pkTaskIds.forEach(taskId -> waitUntilTaskCompleted(taskId));
+ pkTaskIds.forEach(BaseApiTest::waitUntilTaskCompleted);
// Clear system
taskAPI.list(null, -1).forEach(task -> {
diff --git
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/EdgeExistenceAPITest.java
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/EdgeExistenceAPITest.java
new file mode 100644
index 00000000..ff46066c
--- /dev/null
+++
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/EdgeExistenceAPITest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hugegraph.api.traverser;
+
+
+import org.apache.hugegraph.api.BaseApiTest;
+import org.apache.hugegraph.structure.graph.Edge;
+import org.apache.hugegraph.testutil.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.List;
+
+public class EdgeExistenceAPITest extends TraverserApiTest {
+
+ @BeforeClass
+ public static void prepareSchemaAndGraph() {
+ BaseApiTest.initPropertyKey();
+ BaseApiTest.initVertexLabel();
+ BaseApiTest.initEdgeLabel();
+ BaseApiTest.initIndexLabel();
+ BaseApiTest.initVertex();
+ BaseApiTest.initEdge();
+ }
+
+ @Test
+ public void testEdgeExistenceGet() {
+ Object markoId = getVertexId("person", "name", "marko");
+ Object vadasId = getVertexId("person", "name", "vadas");
+
+ List<Edge> edges = edgeExistenceAPI.get(markoId, vadasId, "", "", 100);
+ Assert.assertEquals(1, edges.size());
+
+ String sortValues = edges.get(0).name();
+ edges = edgeExistenceAPI.get(markoId, vadasId, "knows", sortValues,
100);
+ String id = edges.get(0).id();
+
+ Assert.assertEquals(1, edges.size());
+ Assert.assertTrue(id.contains("marko") && id.contains("vadas") &&
id.contains(sortValues));
+
+ Object lopId = getVertexId("software", "name", "lop");
+
+ edges = edgeExistenceAPI.get(lopId, vadasId, "knows", "", 100);
+ Assert.assertEquals(0, edges.size());
+
+ Object joshId = getVertexId("person", "name", "josh");
+ Object rippleId = getVertexId("software", "name", "ripple");
+
+ edges = edgeExistenceAPI.get(joshId, rippleId, "created", "", 100);
+ Assert.assertEquals(1, edges.size());
+
+ edges = edgeExistenceAPI.get(joshId, rippleId, "created", "", 0);
+ Assert.assertEquals(0, edges.size());
+ }
+}
diff --git
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/TraverserApiTest.java
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/TraverserApiTest.java
index 2a02dd10..f6ab7715 100644
---
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/TraverserApiTest.java
+++
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/TraverserApiTest.java
@@ -49,6 +49,7 @@ public class TraverserApiTest extends BaseApiTest {
protected static VerticesAPI verticesAPI;
protected static EdgesAPI edgesAPI;
+ protected static EdgeExistenceAPI edgeExistenceAPI;
@BeforeClass
public static void init() {
@@ -82,5 +83,7 @@ public class TraverserApiTest extends BaseApiTest {
verticesAPI = new VerticesAPI(client, GRAPH);
edgesAPI = new EdgesAPI(client, GRAPH);
+
+ edgeExistenceAPI = new EdgeExistenceAPI(client, GRAPH);
}
}