1

I am developing a data analytics app with Apache Flink and Neo4J (Community Edition).

In this application, the Flink sink must save/update relations in Neo4J.

Which is the best way for Neo4J session management, and why?

First implementation:

public class MySink extends RichSinkFunction<Link> {

  private DbConfiguration dbconfig;

  private Driver driver;

  @Override
  public void open(Configuration parameters) throws Exception {
    this.driver = Neo4JManager.open(this.dbconfig);
  }

  @Override
  public void close() throws Exception {
    this.driver.close();
  }

  @Override
  public void invoke(Link link) throws Exception {
    Session session = this.driver.session();

    Neo4JManager.saveLink(session, link);

    session.close();
  }
}

Second implementation:

public class MySink extends RichSinkFunction<Link> {

  private DbConfiguration dbconfig;

  private Driver driver;

  private Session session;

  @Override
  public void open(Configuration parameters) throws Exception {
    this.driver = Neo4JManager.open(this.dbconfig);
    this.session = driver.session();
  }

  @Override
  public void close() throws Exception {
    this.session.close();
    this.driver.close();
  }

  @Override
  public void invoke(Link link) throws Exception {
    Neo4JManager.saveLink(this.session, link);
  }
}

In both implementations, the following functions have been used:

public class Neo4JManager {
  public static Driver open(DbConfiguration dbconf) {
    AuthToken auth = AuthTokens.basic(dbconf.getUsername(), dbconf.getPassword());
    Config config = Config.build().withEncryptionLevel(Config.EncryptionLevel.NONE ).toConfig();
    return GraphDatabase.driver(dbconf.getHostname(), auth, config);
  }

  public static void saveLink(Session session, Link link) {
    Value params = parameters("x", link.x, "y", link.y);
    session.run('CREATE (Person {id:{x}}-[FOLLOWS]->(Person {id:{y}}))'
  }
}

Thank you.

0 Answers0