Search tag

This commit is contained in:
simon 2019-06-14 10:36:25 -04:00
parent 093e3fcd6c
commit fa1e1a5515
4 changed files with 96 additions and 15 deletions

View File

@ -30,6 +30,7 @@ public class Main {
rc.registerClasses(Index.class); rc.registerClasses(Index.class);
rc.registerClasses(ArtistController.class); rc.registerClasses(ArtistController.class);
rc.registerClasses(CoverController.class); rc.registerClasses(CoverController.class);
rc.registerClasses(TagController.class);
rc.registerClasses(ReleaseController.class); rc.registerClasses(ReleaseController.class);
rc.registerClasses(ChartController.class); rc.registerClasses(ChartController.class);
rc.registerClasses(JacksonFeature.class); rc.registerClasses(JacksonFeature.class);

View File

@ -0,0 +1,7 @@
package net.simon987.musicgraph.entities;
public class TagSearchResult extends SearchResult {
public Tag tag;
}

View File

@ -142,7 +142,7 @@ public class MusicDatabase extends AbstractBinder {
// Only match artists with > 0 releases // Only match artists with > 0 releases
"MATCH (b)-[:CREDITED_FOR]->(:Release)\n" + "MATCH (b)-[:CREDITED_FOR]->(:Release)\n" +
"WHERE r.weight > 0.25\n" + "WHERE r.weight > 0.25\n" +
"RETURN a as artist, a {rels: collect(DISTINCT r), nodes: collect(DISTINCT b)} as rank1\n" + "RETURN a as artist, {rels: collect(DISTINCT r), nodes: collect(DISTINCT b)} as rank1\n" +
"LIMIT 1", "LIMIT 1",
params); params);
@ -156,31 +156,62 @@ public class MusicDatabase extends AbstractBinder {
return null; return null;
} }
} }
public TagSearchResult getRelatedByTag(long id) {
try (Session session = driver.session()) {
Map<String, Object> params = new HashMap<>();
params.put("tag_id", id);
StatementResult result = query(session,
"MATCH (t:Tag)-[r:IS_TAGGED]-(a:Artist)\n" +
"WHERE ID(t) = $tag_id\n" +
"RETURN t, {rels: collect(DISTINCT r), nodes: collect(DISTINCT a)} as rank1\n" +
"LIMIT 1",
params);
TagSearchResult out = new TagSearchResult();
if (result.hasNext()) {
Record row = result.next();
out.tag = makeTag(row.get(0).asNode());
artistsFromRelMap(out, row.get(1).asMap());
}
return out;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private void parseRelatedResult(StatementResult result, SearchResult out) { private void parseRelatedResult(StatementResult result, SearchResult out) {
long start = System.nanoTime(); long start = System.nanoTime();
while (result.hasNext()) { if (result.hasNext()) {
Record row = result.next(); Record row = result.next();
out.artists.add(makeArtist(row.get(0).asNode())); out.artists.add(makeArtist(row.get(0).asNode()));
var rank1 = row.get(1).asMap(); artistsFromRelMap(out, row.get(1).asMap());
out.relations.addAll(((List<Relationship>) rank1.get("rels"))
.stream()
.map(MusicDatabase::makeRelation)
.collect(Collectors.toList()
));
out.artists.addAll(((List<Node>) rank1.get("nodes"))
.stream()
.map(MusicDatabase::makeArtist)
.collect(Collectors.toList()
));
} }
long end = System.nanoTime(); long end = System.nanoTime();
long took = (end - start) / 1000000; long took = (end - start) / 1000000;
logger.info(String.format("Fetched search result (Took %dms)", took)); logger.info(String.format("Fetched search result (Took %dms)", took));
} }
private void artistsFromRelMap(SearchResult out, Map<String, Object> rank1) {
out.relations.addAll(((List<Relationship>) rank1.get("rels"))
.stream()
.map(MusicDatabase::makeRelation)
.collect(Collectors.toList()
));
out.artists.addAll(((List<Node>) rank1.get("nodes"))
.stream()
.map(MusicDatabase::makeArtist)
.collect(Collectors.toList()
));
}
private static Artist makeArtist(Node node) { private static Artist makeArtist(Node node) {
Artist artist = new Artist(); Artist artist = new Artist();
artist.id = node.id(); artist.id = node.id();
@ -194,6 +225,14 @@ public class MusicDatabase extends AbstractBinder {
return artist; return artist;
} }
private static Tag makeTag(Node node) {
return new Tag(
node.id(),
node.get("name").asString(),
0
);
}
private static Relation makeRelation(Relationship rel) { private static Relation makeRelation(Relationship rel) {
Relation relation = new Relation(); Relation relation = new Relation();

View File

@ -0,0 +1,34 @@
package net.simon987.musicgraph.webapi;
import net.simon987.musicgraph.entities.SearchResult;
import net.simon987.musicgraph.io.MusicDatabase;
import net.simon987.musicgraph.logging.LogManager;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.logging.Logger;
@Path("/tag")
public class TagController {
private static Logger logger = LogManager.getLogger();
@Inject
private MusicDatabase db;
public TagController() {
}
@GET
@Path("related/{id}")
@Produces(MediaType.APPLICATION_JSON)
public SearchResult getRelated(@PathParam("id") long id) {
logger.info(String.format("Related tag for %d", id));
return db.getRelatedByTag(id);
}
}