This is an automated email from the ASF dual-hosted git repository. jin pushed a commit to branch olap-algo in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph.git
commit 963b39416874dc73b365019f5ae80226ba52addf Author: zhoney <[email protected]> AuthorDate: Tue May 26 20:52:17 2020 +0800 Support ring detect count (#17) * support rings count for rings-detect ap algo * fix direction can't be null or Both for triangle and clusterCoeffcient * fix source_clabel error for rings-detect, fusiform and kcore * change limit meaning for fusiform similarity Change-Id: I5a4ccbf46b47c13ea2eafe7f3e335dc6aea4a83c --- .../hugegraph/job/algorithm/AbstractAlgorithm.java | 24 +++++++++++++-- .../algorithm/comm/ClusterCoeffcientAlgorithm.java | 2 +- .../job/algorithm/comm/TriangleCountAlgorithm.java | 2 +- .../job/algorithm/path/RingsDetectAlgorithm.java | 36 +++++++++++++++++++--- .../similarity/FusiformSimilarityAlgorithm.java | 14 +++++++-- 5 files changed, 66 insertions(+), 12 deletions(-) diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/AbstractAlgorithm.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/AbstractAlgorithm.java index 5bb3426ff..d3311772a 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/AbstractAlgorithm.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/AbstractAlgorithm.java @@ -19,7 +19,6 @@ package com.baidu.hugegraph.job.algorithm; - import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -131,6 +130,17 @@ public abstract class AbstractAlgorithm implements Algorithm { return parseDirection(direction); } + protected static Directions directionOutIn(Map<String, Object> parameters) { + E.checkArgument(parameters.containsKey(KEY_DIRECTION), + "The direction must be set"); + Object direction = parameter(parameters, KEY_DIRECTION); + Directions direct = parseDirection(direction); + E.checkArgument(direct == Directions.OUT || direct == Directions.IN, + "The direction for triangle_count must be " + + "either OUT or IN, but got: %s", direct); + return direct; + } + protected static double alpha(Map<String, Object> parameters) { if (!parameters.containsKey(KEY_ALPHA)) { return DEFAULT_ALPHA; @@ -330,8 +340,16 @@ public abstract class AbstractAlgorithm implements Algorithm { protected long traverse(String sourceLabel, String sourceCLabel, Consumer<Vertex> consumer, Runnable done) { - Iterator<Vertex> vertices = this.vertices(sourceLabel, sourceLabel, - Query.NO_LIMIT); + return this.traverse(sourceLabel, sourceCLabel, consumer, done, + NO_LIMIT); + } + + protected long traverse(String sourceLabel, String sourceCLabel, + Consumer<Vertex> consumer, Runnable done, + long limit) { + long actualLimit = limit == NO_LIMIT ? Query.NO_LIMIT : limit; + Iterator<Vertex> vertices = this.vertices(sourceLabel, sourceCLabel, + actualLimit); Consumers<Vertex> consumers = new Consumers<>(this.executor, consumer, done); diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/ClusterCoeffcientAlgorithm.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/ClusterCoeffcientAlgorithm.java index 52f0b07a7..0e5760e24 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/ClusterCoeffcientAlgorithm.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/ClusterCoeffcientAlgorithm.java @@ -34,7 +34,7 @@ public class ClusterCoeffcientAlgorithm extends AbstractCommAlgorithm { @Override public void checkParameters(Map<String, Object> parameters) { - direction(parameters); + directionOutIn(parameters); degree(parameters); } diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/TriangleCountAlgorithm.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/TriangleCountAlgorithm.java index 34a1a5658..6128c6b17 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/TriangleCountAlgorithm.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/TriangleCountAlgorithm.java @@ -42,7 +42,7 @@ public class TriangleCountAlgorithm extends AbstractCommAlgorithm { @Override public void checkParameters(Map<String, Object> parameters) { - direction(parameters); + directionOutIn(parameters); degree(parameters); } diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/path/RingsDetectAlgorithm.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/path/RingsDetectAlgorithm.java index 855b7c817..c7c0c677a 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/path/RingsDetectAlgorithm.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/path/RingsDetectAlgorithm.java @@ -20,6 +20,7 @@ package com.baidu.hugegraph.job.algorithm.path; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import com.baidu.hugegraph.backend.id.Id; import com.baidu.hugegraph.job.Job; @@ -30,6 +31,8 @@ import com.baidu.hugegraph.util.JsonUtil; public class RingsDetectAlgorithm extends AbstractAlgorithm { + public static final String KEY_COUNT_ONLY = "count_only"; + @Override public String name() { return "rings_detect"; @@ -50,6 +53,7 @@ public class RingsDetectAlgorithm extends AbstractAlgorithm { sourceCLabel(parameters); direction(parameters); edgeLabel(parameters); + countOnly(parameters); workers(parameters); } @@ -64,10 +68,18 @@ public class RingsDetectAlgorithm extends AbstractAlgorithm { depth(parameters), degree(parameters), capacity(parameters), - limit(parameters)); + limit(parameters), + countOnly(parameters)); } } + public boolean countOnly(Map<String, Object> parameters) { + if (!parameters.containsKey(KEY_COUNT_ONLY)) { + return false; + } + return parameterBoolean(parameters, KEY_COUNT_ONLY); + } + public static class Traverser extends AlgoTraverser { public Traverser(Job<Object> job, int workers) { @@ -76,13 +88,19 @@ public class RingsDetectAlgorithm extends AbstractAlgorithm { public Object rings(String sourceLabel, String sourceCLabel, Directions dir, String label, int depth, - long degree, long capacity, long limit) { + long degree, long capacity, long limit, + boolean countOnly) { JsonMap ringsJson = new JsonMap(); ringsJson.startObject(); - ringsJson.appendKey("rings"); - ringsJson.startList(); + if (countOnly) { + ringsJson.appendKey("rings_count"); + } else { + ringsJson.appendKey("rings"); + ringsJson.startList(); + } SubGraphTraverser traverser = new SubGraphTraverser(this.graph()); + AtomicInteger count = new AtomicInteger(0); this.traverse(sourceLabel, sourceCLabel, v -> { Id source = (Id) v.id(); @@ -96,6 +114,10 @@ public class RingsDetectAlgorithm extends AbstractAlgorithm { } } if (source.equals(min)) { + if (countOnly) { + count.incrementAndGet(); + continue; + } String ringJson = JsonUtil.toJson(ring.vertices()); synchronized (ringsJson) { ringsJson.appendRaw(ringJson); @@ -103,7 +125,11 @@ public class RingsDetectAlgorithm extends AbstractAlgorithm { } } }); - ringsJson.endList(); + if (countOnly) { + ringsJson.append(count.get()); + } else { + ringsJson.endList(); + } ringsJson.endObject(); return ringsJson.asJson(); diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/similarity/FusiformSimilarityAlgorithm.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/similarity/FusiformSimilarityAlgorithm.java index 463526c5d..673430623 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/similarity/FusiformSimilarityAlgorithm.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/similarity/FusiformSimilarityAlgorithm.java @@ -43,6 +43,7 @@ public class FusiformSimilarityAlgorithm extends AbstractAlgorithm { public static final int DEFAULT_MIN_NEIGHBORS = 10; public static final int DEFAULT_MIN_SIMILARS = 6; public static final int DEFAULT_MIN_GROUPS = 1; + public static final long DEFAULT_LIMIT = -1L; @Override public String name() { @@ -126,6 +127,15 @@ public class FusiformSimilarityAlgorithm extends AbstractAlgorithm { return minGroups; } + protected static long limit(Map<String, Object> parameters) { + if (!parameters.containsKey(KEY_LIMIT)) { + return DEFAULT_LIMIT; + } + long limit = parameterLong(parameters, KEY_LIMIT); + HugeTraverser.checkLimit(limit); + return limit; + } + protected static class Traverser extends AlgoTraverser { public Traverser(Job<Object> job, int workers) { @@ -152,7 +162,7 @@ public class FusiformSimilarityAlgorithm extends AbstractAlgorithm { edgeLabel, minNeighbors, alpha, minSimilars, (int) topSimilars, groupProperty, minGroups, degree, - capacity, limit, true); + capacity, NO_LIMIT, true); if (similars.isEmpty()) { return; } @@ -161,7 +171,7 @@ public class FusiformSimilarityAlgorithm extends AbstractAlgorithm { synchronized (similarsJson) { similarsJson.appendRaw(result); } - }); + }, null, limit); similarsJson.endObject(); return similarsJson.asJson();
