Building APIs to access Neo4j data -
i have huge neo4j database created using batch import tool. want expose parts of data via apis (that run query in backend) users. requirements pretty general:
1. latency should minimum
2. support qps of ~10-20.
can give me recommendations on should use , documentation on how go this? see several examples of ruby/rails , rest apis -- specific exposing data without complex queries in backend. not sure how translate specific apis want. appreciated.
thanks.
check out graphaware framework. can build apis directly on top of neo4j (same jvm) have use cypher, java, or scala.
i'd start cypher, because can write quickly, optimise performance, , finally, if else fails , latency still high, convert java.
you can expose subgraphs (or partially hydrated nodes , relationship, i.e. properties) easily. checkout out stuff in api package. example code:
you'd write controller return person's graph, include nodes' names (not ages or else):
@restcontroller public class apiexample { private final graphdatabaseservice database; @autowired public apiexample(graphdatabaseservice database) { this.database = database; } @requestmapping(path = "person/{name}") public jsongraph getpersongraph(@pathvariable(value = "name") string name) { jsongraph<?> result = new jsongraph() { @override protected jsongraph self() { return this; } }; try (transaction tx = database.begintx()) { node person = database.findnode(label("person"), "name", name); if (person == null) { throw new notfoundexception(); //eventually translate 404 } result.addnode(person, includeonlynamenodetransformer.instance); (relationship worksfor : person.getrelationships(withname("works_for"), direction.outgoing)) { result.addrelationship(worksfor); result.addnode(worksfor.getendnode(), includeonlynamenodetransformer.instance); } tx.success(); } return result; } private static final class includeonlynamenodetransformer implements nodetransformer<longidjsonnode> { private static final includeonlynamenodetransformer instance = new includeonlynamenodetransformer(); private includeonlynamenodetransformer() { } @override public longidjsonnode transform(node node) { return new longidjsonnode(node, new string[]{"name"}); } } } running test
public class apiexampletest extends graphawareapitest { @override protected void populatedatabase(graphdatabaseservice database) { database.execute("create index on :person(name)"); database.execute("create (:person {name:'michal', age:32})-[:works_for {since:2013}]->(:company {name:'graphaware', est:2013})"); } @test public void testexample() { system.out.println(httpclient.get(baseurl() + "/person/michal/", 200)); } } would return following json
{ "nodes": [ { "properties": { "name": "graphaware" }, "labels": [ "company" ], "id": 1 }, { "properties": { "name": "michal" }, "labels": [ "person" ], "id": 0 } ], "relationships": [ { "properties": { "since": 2013 }, "type": "works_for", "id": 0, "startnodeid": 0, "endnodeid": 1 } ] }
Comments
Post a Comment