Skip to content

Instantly share code, notes, and snippets.

@angryTit
Created July 21, 2017 12:35
Show Gist options
  • Save angryTit/e0d1e18c0074cc8549b053709f63efdf to your computer and use it in GitHub Desktop.
Save angryTit/e0d1e18c0074cc8549b053709f63efdf to your computer and use it in GitHub Desktop.
GraphTraversalSource traversal = titanGraph.traversal();
long startSimilarQuery = System.currentTimeMillis();
List<Vertex> similars = traversal.V()
.has(USER_LABEL, USER_ID_PROPERTY, userId)
.outE(SIMILAR_RELATIONSHIP)
.order()
.by(new Comparator<Edge>() {
@Override
public int compare(Edge o1, Edge o2) {
Integer similarO1 = (Integer) o1.property(SIMILAR_WEIGHT_RELATIONSHIP_PROPERTY).value();
Integer similarO2 = (Integer) o2.property(SIMILAR_WEIGHT_RELATIONSHIP_PROPERTY).value();
return (-1) * similarO1.compareTo(similarO2);
}
})
.inV()
.toList();
long endSimilarQuery = System.currentTimeMillis();
log.info("Stats : Fetch similars query tooks : {} with result size : {}",
endSimilarQuery - startSimilarQuery, similars.size());
if (similars.isEmpty()) {
log.info("There is no similar users for user with id : {}", userId);
return emptyList();
}
long startKnowPersonsQuery = System.currentTimeMillis();
Set knownPersonIds = traversal.V()
.has(USER_LABEL, USER_ID_PROPERTY, userId)
.out()
.properties(USER_ID_PROPERTY)
.value()
.toSet();
long endKnowPersonsQuery = System.currentTimeMillis();
log.info("Stats : Fetch known person query tooks : {} with result size : {}",
endKnowPersonsQuery - startKnowPersonsQuery, knownPersonIds.size());
log.info("User knows {} persons", knownPersonIds.size());
long startSimilarIteration = System.currentTimeMillis();
List recoList = new ArrayList();
for (Vertex each : similars) {
if (recoList.size() < limit) {
GraphTraversal<Vertex, Vertex> simTraversal =
traversal
.V(each.id())
.out(LIKE_RELATIONSHIP, MATCH_RELATIONSHIP)
.has(USER_LABEL, USER_HIDDEN_PROPERTY, false);
if (nonNull(gender) && (
Objects.equals(gender.toLowerCase(), "male")) ||
Objects.equals(gender.toLowerCase(), "female")
) {
simTraversal = simTraversal.has(USER_LABEL, USER_GENDER_PROPERTY, gender.toLowerCase());
}
GraphTraversal<Vertex, Object> targetTraversal =
simTraversal.properties(USER_ID_PROPERTY).value();
while (targetTraversal.hasNext() && recoList.size() < limit) {
Object candidateUserId = targetTraversal.next();
if (!knownPersonIds.contains(candidateUserId)) {
recoList.add(candidateUserId);
}
}
}
}
long endSimilarIteration = System.currentTimeMillis();
log.info("Stats : Similar iteration tooks : {} with result size : {}",
endSimilarIteration - startSimilarIteration, recoList.size());
log.info("Result recommendation list size : {} for user id : {}", recoList.size(), userId);
return recoList;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment