создание узла в neo4j с использованием драйвера java - PullRequest
0 голосов
/ 15 мая 2018

Я создаю узлы в Neo4j , используя neo4j-java driver с помощью следующего Cipher Query.

String cipherQuery = "CREATE (n:MLObsTemp { personId: " + personId + ",conceptId: " + conceptId
                            + ",obsId: " + obsId + ",MLObsId: " + mlObsId + ",encounterId: " + encounterId + "}) RETURN n";

Функция для создания запроса

createNeo4JObsNode(String cipherQuery);

Реализация функции

private void createNeo4JObsNode(String cipherQuery) throws Exception {
   try (ConNeo4j greeter = new ConNeo4j("bolt://localhost:7687", "neo4j", "qwas")) {
   System.out.println("Executing query : " + cipherQuery);

  try (Session session = driver.session()) {
   StatementResult result = session.run(cipherQuery);

  } catch (Exception e) {
   System.out.println("Error" + e.getMessage());
  }

 } catch (Exception e) {
  e.printStackTrace();
 }

}

Создание связи для вышеуказанных узлов с использованием кода ниже

String obsMatchQuery = "MATCH (m:MLObsTemp),(o:Obs) WHERE m.obsId=o.obsId CREATE (m)-[:OBS]->(o)";
        createNeo4JObsNode(obsMatchQuery);

        String personMatchQuery = "MATCH (m:MLObsTemp),(p:Person) WHERE m.personId=p.personId CREATE (m)-[:PERSON]->(p)";
        createNeo4JObsNode(personMatchQuery);

        String encounterMatchQuery = "MATCH (m:MLObsTemp),(e:Encounter) WHERE m.encounterId=e.encounterId CREATE (m)-[:ENCOUNTER]->(e)";
        createNeo4JObsNode(encounterMatchQuery);

        String conceptMatchQuery = "MATCH (m:MLObsTemp),(c:Concept) WHERE m.conceptId=c.conceptId CREATE (m)-[:CONCEPT]->(c)";
        createNeo4JObsNode(conceptMatchQuery);

У меня уходит в среднем 13 секунд на создание узлов и 12 секунд на создание отношений. У меня есть 350 тыс. Записей в моей базе данных, для которых я должен создать узлы и их соответствующие отношения.

Как я могу улучшить свой код? Кроме того, это лучший способ создания узлов в Neo4j с использованием сервера болтов и драйвера neo4j-java?

EDIT

Я сейчас использую параметр запроса в своем коде

 HashMap<String, Object> parameters = new HashMap<String, Object>();

         ((HashMap<String, Object>) parameters).put("personId", 1390);
         ((HashMap<String, Object>) parameters).put("obsId", 14001);
         ((HashMap<String, Object>) parameters).put("conceptId", 5978);
         ((HashMap<String, Object>) parameters).put("encounterId", 10810);
         ((HashMap<String, Object>) parameters).put("mlobsId", 2);



         String cypherQuery=
                 "CREATE (m:MLObsTemp { personId: $personId, ObsId: $obsId, conceptId: $conceptId, MLObsId: $mlobsId, encounterId: $encounterId}) "
                + "WITH m MATCH (p:Person { personId: $personId }) CREATE (m)-[:PERSON]->(p) "
                + "WITH m MATCH (e:Encounter {encounterId: $encounterId }) CREATE (m)-[:Encounter]->(e) "
                + "WITH m MATCH (o:Obs {obsId: $obsId }) CREATE (m)-[:OBS]->(o) "
                + "WITH m MATCH (c:Concept {conceptId: $conceptId }) CREATE (m)-[:CONCEPT]->(c) "
                + " RETURN m";

Создание функции узла

 try {
  ConNeo4j greeter = new ConNeo4j("bolt://localhost:7687", "neo4j", "qwas");

  try {
   Session session = driver.session();
   StatementResult result = session.run(cypherQuery, parameters);
   System.out.println(result);
  } catch (Exception e) {
   System.out.println("[WARNING] Null Row");
  }

 } catch (Exception e) {
  e.printStackTrace();
 }

Я также выполняю индексирование для ускорения процесса

  CREATE CONSTRAINT ON (P:Person) ASSERT P.personId IS UNIQUE
        CREATE CONSTRAINT ON (E:Encounter) ASSERT E.encounterId IS UNIQUE
        CREATE CONSTRAINT ON (O:Obs) ASSERT O.obsId IS UNIQUE
        CREATE CONSTRAINT ON (C:Concept) ASSERT C.conceptId IS UNIQUE

Вот план для 1 шифра query-profile

Теперь производительность улучшилась, но незначительно. Я использую neo4j-java-driver версии 1.6.1. Как я могу пакетировать мои зашифрованные запросы для дальнейшего повышения производительности.

1 Ответ

0 голосов
/ 15 мая 2018

Вы должны попытаться минимизировать избыточную работу в ваших шифрах.

MLObsTemp имеет много избыточных свойств, и вы ищете его для создания каждой ссылки.Отношения избавляют от необходимости создавать свойства для внешних ключей (идентификаторы узлов)

Я бы порекомендовал Cypher, который делает все вместе и использует такие параметры, как ...

CREATE (m:MLObsTemp) 
WITH m MATCH (p:Person {id:"$person_id"}) CREATE (m)-[:PERSON]->(p)
WITH m MATCH (e:Encounter {id:"$encounter_id"}) CREATE (m)-[:Encounter]->(e)
WITH m MATCH (c:Concept {id:"$concept_id"}) CREATE (m)-[:CONCEPT]->(c)
// SNIP more MATCH/CREATE
RETURN m

Таким образом,Neo4j не нужно повторно искать m для каждого отношения.Вам не нужны свойства идентификатора, потому что это фактически то, чем являются только что созданные вами отношения.Neo4j очень эффективен при ходьбе по краям (отношениям), поэтому просто следуйте отношениям, если вам нужно значение идентификатора.

СОВЕТЫ: ​​(пробег может очень сильно различаться в версиях Neo4j)

  • Inline isпочти всегда более эффективен, чем WHERE (MATCH (n{id:"rawr"}) против MATCH (n) WHERE n.id="rawr")
  • Параметры делают более частыми подобные запросы более эффективными, поскольку Neo4j будет кешировать, как это сделать быстро ($thing_idсинтаксис, использованный в приведенном выше запросе.) Кроме того, он защищает вас от внедрения Cypher (см. SQL-внедрение )
  • Из сеанса вы можете создать транзакцию (Session.run () фактически создаеттранзакция для каждого вызова прогона).Вы можете пакетировать несколько шифров, используя одну транзакцию (даже используя результаты предыдущих шифров из той же транзакции), потому что транзакции живут в памяти, пока вы не отметите ее как успешный и не закроете.Обратите внимание, что если вы не будете осторожны, ваша транзакция может потерпеть неудачу с «outofmemory».Поэтому не забывайте периодически совершать / между партиями.(фиксация пакетов по 10 тыс. записей кажется нормой при приеме больших наборов данных)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...