You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hugegraph.apache.org by ji...@apache.org on 2022/11/09 10:25:26 UTC
[incubator-hugegraph] 23/33: add export_community for lounvain (#43)
This is an automated email from the ASF dual-hosted git repository.
jin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph.git
commit 9926fc6e05d54019df64a8c89c2b2a188ca5ce63
Author: Jermy Li <li...@baidu.com>
AuthorDate: Thu Aug 20 18:09:56 2020 +0800
add export_community for lounvain (#43)
Change-Id: I01e402fc99669f53544279c752f81d886c6ce28f
---
.../hugegraph/job/algorithm/AbstractAlgorithm.java | 10 +++++-
.../job/algorithm/comm/LouvainAlgorithm.java | 15 +++++++++
.../job/algorithm/comm/LouvainTraverser.java | 39 +++++++++++++++++++++-
3 files changed, 62 insertions(+), 2 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 064b1e344..943debb4b 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
@@ -68,6 +68,9 @@ public abstract class AbstractAlgorithm implements Algorithm {
public static final long MAX_CAPACITY = MAX_QUERY_LIMIT;
public static final int BATCH = 500;
+ public static final String USER_DIR = System.getProperty("user.dir");
+ public static final String EXPORT_PATH = USER_DIR + "/export";
+
public static final String CATEGORY_AGGR = "aggregate";
public static final String CATEGORY_PATH = "path";
public static final String CATEGORY_RANK = "rank";
@@ -89,6 +92,7 @@ public abstract class AbstractAlgorithm implements Algorithm {
public static final String KEY_PRECISION = "precision";
public static final String KEY_SHOW_MOD= "show_modularity";
public static final String KEY_SHOW_COMM = "show_community";
+ public static final String KEY_EXPORT_COMM = "export_community";
public static final String KEY_SKIP_ISOLATED = "skip_isolated";
public static final String KEY_CLEAR = "clear";
public static final String KEY_CAPACITY = "capacity";
@@ -287,7 +291,7 @@ public abstract class AbstractAlgorithm implements Algorithm {
protected AlgoTraverser(UserJob<Object> job, String name, int workers) {
super(job.graph());
this.job = job;
- String prefix = name + "-" + job.task().id();
+ String prefix = name + "-" + this.jobId();
this.executor = Consumers.newThreadPool(prefix, workers);
}
@@ -295,6 +299,10 @@ public abstract class AbstractAlgorithm implements Algorithm {
this.job.updateProgress((int) progress);
}
+ public Id jobId() {
+ return this.job.task().id();
+ }
+
@Override
public void close() {
if (this.executor != null) {
diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/LouvainAlgorithm.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/LouvainAlgorithm.java
index 3b3b0a6b8..3789d6a19 100644
--- a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/LouvainAlgorithm.java
+++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/LouvainAlgorithm.java
@@ -44,6 +44,7 @@ public class LouvainAlgorithm extends AbstractCommAlgorithm {
sourceCLabel(parameters);
showModularity(parameters);
showCommunity(parameters);
+ exportCommunity(parameters);
skipIsolated(parameters);
clearPass(parameters);
workers(parameters);
@@ -60,6 +61,7 @@ public class LouvainAlgorithm extends AbstractCommAlgorithm {
Long clearPass = clearPass(parameters);
Long modPass = showModularity(parameters);
String showComm = showCommunity(parameters);
+ Long exportPass = exportCommunity(parameters);
try (LouvainTraverser traverser = new LouvainTraverser(
job, workers, degree,
@@ -68,6 +70,10 @@ public class LouvainAlgorithm extends AbstractCommAlgorithm {
return traverser.clearPass(clearPass.intValue());
} else if (modPass != null) {
return traverser.modularity(modPass.intValue());
+ } else if (exportPass != null) {
+ boolean vertexFirst = showComm == null;
+ int pass = exportPass.intValue();
+ return traverser.exportCommunity(pass, vertexFirst);
} else if (showComm != null) {
return traverser.showCommunity(showComm);
} else {
@@ -99,6 +105,15 @@ public class LouvainAlgorithm extends AbstractCommAlgorithm {
return pass;
}
+ protected static Long exportCommunity(Map<String, Object> parameters) {
+ if (!parameters.containsKey(KEY_EXPORT_COMM)) {
+ return null;
+ }
+ long pass = ParameterUtil.parameterLong(parameters, KEY_EXPORT_COMM);
+ HugeTraverser.checkNonNegative(pass, KEY_EXPORT_COMM);
+ return pass;
+ }
+
protected static boolean skipIsolated(Map<String, Object> parameters) {
if (!parameters.containsKey(KEY_SKIP_ISOLATED)) {
return true;
diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/LouvainTraverser.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/LouvainTraverser.java
index 42ac3e990..4359d46b8 100644
--- a/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/LouvainTraverser.java
+++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/job/algorithm/comm/LouvainTraverser.java
@@ -19,6 +19,9 @@
package com.baidu.hugegraph.job.algorithm.comm;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -59,6 +62,7 @@ import com.baidu.hugegraph.structure.HugeVertex;
import com.baidu.hugegraph.type.define.Directions;
import com.baidu.hugegraph.util.InsertionOrderUtil;
import com.baidu.hugegraph.util.Log;
+import com.baidu.hugegraph.util.StringEncoding;
import com.google.common.collect.ImmutableMap;
public class LouvainTraverser extends AlgoTraverser {
@@ -660,7 +664,7 @@ public class LouvainTraverser extends AlgoTraverser {
Vertex sub = subComms.next();
if (sub.property(C_MEMBERS).isPresent()) {
Set<Object> members = sub.value(C_MEMBERS);
- reachPass0 = sub.label().equals(C_PASS0);
+ reachPass0 = sub.label().equals(C_PASS0);
comms.addAll(members);
}
}
@@ -668,6 +672,39 @@ public class LouvainTraverser extends AlgoTraverser {
return comms;
}
+ public long exportCommunity(int pass, boolean vertexFirst) {
+ String exportFile = String.format("%s/louvain-%s.txt",
+ LouvainAlgorithm.EXPORT_PATH,
+ this.jobId());
+ String label = labelOfPassN(pass);
+ GraphTraversal<Vertex, Vertex> t = this.g.V().hasLabel(label);
+ this.execute(t, () -> {
+ try (OutputStream os = new FileOutputStream(exportFile);
+ BufferedOutputStream bos = new BufferedOutputStream(os)) {
+ while (t.hasNext()) {
+ String comm = t.next().id().toString();
+ Collection<Object> members = this.showCommunity(comm);
+ if (vertexFirst) {
+ for (Object member : members) {
+ bos.write(StringEncoding.encode(member.toString()));
+ bos.write(StringEncoding.encode("\t"));
+ bos.write(StringEncoding.encode(comm));
+ bos.write(StringEncoding.encode("\n"));
+ }
+ } else {
+ bos.write(StringEncoding.encode(comm));
+ bos.write(StringEncoding.encode(": "));
+ bos.write(StringEncoding.encode(members.toString()));
+ bos.write(StringEncoding.encode("\n"));
+ }
+ }
+ }
+ return null;
+ });
+
+ return this.progress;
+ }
+
public long clearPass(int pass) {
GraphTraversal<Edge, Edge> te = this.g.E();
if (pass < 0) {