Cypher се изпълнява от съхранена процедура много по-бавно от необработения cypher

Имам заявка и модел, които използвах за изпълнение с различни стойности на параметри за идентифициране и създаване на възли. Исках да направя писането със заявката по-лесно, така че поставих заявката в съхранена процедура, компилирах jar и започнах обработката си.

Въпреки че е по-лесно да се извика съхранената процедура и да се подадат параметрите, времето за изпълнение беше МНОГО по-бавно (около 10 пъти по-бавно) и ставаше все по-лошо, докато зареждах все повече и повече данни в графиката. Когато се върнах към използване на необработените заявки (и повече копиране/поставяне), времето ми за изпълнение спадна обратно.

Усещането е сякаш базата данни се прекомпилира и/или препланира всеки път, когато се изпълнява заявката в извикванията на съхранена процедура.

Има ли начин да кеширате заявката от съхранената процедура?

От това, което мога да кажа, моят код е идентичен отвътре и извън съхранената процедура. Съхранената процедура работи, просто много много бавно в сравнение с извикването на шифъра извън процедурата.

По-долу е моята необработена шифрова заявка

with ['register'] as verbs match (e:Entity {type:'PRODUCT', graphId: $graphId})
USING INDEX e:Entity(graphId)
with e, verbs
match (e)-[:REFERS]->(eWord:Word {graphId:$graphId})<-[:OBJ|OBL|NMOD]-(vb:Word {graphId: $graphId})-[]->(notWord:Word {graphId: $graphId})
USING INDEX vb:Word(graphId)
USING INDEX notWord:Word(graphId)
  where vb.lemma in verbs
create (event:Event {graphId: $graphId, type: 'registerFail'})
with event, e, vb, notWord
merge (event)-[:TRIGGER]->(vb)
merge (event)-[:TRIGGER]->(notWord)
merge (event)-[:RELATED_PRODUCT]->(e)
with event
match (event)-[:TRIGGER]->(word:Word {graphId: $graphId})-[:COMPOUND|COMPOUND_PRT]->(compWord:Word {graphId: $graphId})
USING INDEX word:Word(graphId)
USING INDEX compWord:Word(graphId)
merge (event)-[:TRIGGER]->(compWord);

Ето кода на моята съхранена процедура

@Procedure(name = "ie.createInabilityCypher", mode = Mode.WRITE)
public void createInabilityFromProduct(@Name("listOfVerbs") List<String> verbs, @Name("inabilityType") String inabilityType, @Name("graphId") String graphId) {

    String cypherQuery = "" +
            "with $verbsList as verbs " +
            "match (e:Entity {type:'PRODUCT', graphId: $graphId}) " +
            "USING INDEX e:Entity(graphId) " +
            "with e, verbs " +
            "match (e)-[:REFERS]->(eWord:Word {graphId:$graphId})<-[:OBJ|OBL|NMOD]-(vb:Word {graphId: '" + graphId +"'})-[]->(notWord:Word {graphId: $graphId}) " +
            "USING INDEX vb:Word(graphId) " +
            "USING INDEX notWord:Word(graphId) " +
            "where vb.lemma in verbs " +
            "create (event:Event {graphId: $graphId, type: $inabilityType}) " +
            "with event, e, vb, notWord " +
            "merge (event)-[:TRIGGER]->(vb) " +
            "merge (event)-[:TRIGGER]->(notWord) " +
            "merge (event)-[:RELATED_PRODUCT]->(e) " +
            "with event " +
            "match (event)-[:TRIGGER]->(word:Word {graphId: $graphId})-[:COMPOUND|COMPOUND_PRT]->(compWord:Word {graphId: $graphId}) " +
            "USING INDEX word:Word(graphId) " +
            "USING INDEX compWord:Word(graphId) " +
            "merge (event)-[:TRIGGER]->(compWord)";

    Map<String, Object> params = new HashMap<>();
    params.put("graphId", graphId);
    params.put("verbsList", verbs);
    params.put("inabilityType", inabilityType);
    tx.execute(cypherQuery, params);

person Joshua Sperry    schedule 18.06.2020    source източник


Отговори (1)


Пропуснахте едно място, където трябва да се използва параметърът $graphId. Ето защо кодът на Cypher се "прекомпилира" всеки път.

Опитайте да замените този фрагмент:

(vb:Word {graphId: '" + graphId +"'})

с тази:

(vb:Word {graphId: $graphId})
person cybersam    schedule 18.06.2020