SingleEdgeEmbeddings.java
/*
* Copyright © 2014 - 2021 Leipzig University (Database Research Group)
*
* Licensed 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.gradoop.flink.algorithms.fsm.transactional.tle.functions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.gradoop.flink.algorithms.fsm.transactional.common.FSMConfig;
import org.gradoop.flink.algorithms.fsm.transactional.tle.canonicalization.CanonicalLabeler;
import org.gradoop.flink.algorithms.fsm.transactional.tle.pojos.Embedding;
import org.gradoop.flink.algorithms.fsm.transactional.tle.pojos.FSMEdge;
import org.gradoop.flink.algorithms.fsm.transactional.tle.pojos.FSMGraph;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* Superclass of flatmap functions extracting distinct single-edge subgraphs
* and all embeddings from a graph.
*/
public abstract class SingleEdgeEmbeddings implements Serializable {
/**
* graph labeler
*/
protected CanonicalLabeler canonicalLabeler;
/**
* Constructor.
*
* @param fsmConfig FSM configuration
*/
public SingleEdgeEmbeddings(FSMConfig fsmConfig) {
canonicalLabeler = new CanonicalLabeler(fsmConfig.isDirected());
}
/**
* Finds all embeddings.
*
* @param graph graph
* @return 1-edge embeddings
*/
protected Map<String, List<Embedding>> createEmbeddings(
FSMGraph graph) {
Map<Integer, String> vertices = graph.getVertices();
Map<String, List<Embedding>> subgraphEmbeddings = Maps.newHashMap();
for (Map.Entry<Integer, FSMEdge> entry : graph.getEdges().entrySet()) {
FSMEdge edge = entry.getValue();
int sourceId = edge.getSourceId();
int targetId = edge.getTargetId();
Map<Integer, String> incidentVertices =
Maps.newHashMapWithExpectedSize(2);
incidentVertices.put(sourceId, vertices.get(sourceId));
if (sourceId != targetId) {
incidentVertices.put(targetId, vertices.get(targetId));
}
Map<Integer, FSMEdge> singleEdge = Maps.newHashMapWithExpectedSize(1);
singleEdge.put(entry.getKey(), edge);
Embedding
embedding = new Embedding(incidentVertices, singleEdge);
String subgraph = canonicalLabeler.label(embedding);
List<Embedding> embeddings = subgraphEmbeddings.get(subgraph);
if (embeddings == null) {
subgraphEmbeddings.put(subgraph, Lists.newArrayList(embedding));
} else {
embeddings.add(embedding);
}
}
return subgraphEmbeddings;
}
}