Имам заявка и модел, които използвах за изпълнение с различни стойности на параметри за идентифициране и създаване на възли. Исках да направя писането със заявката по-лесно, така че поставих заявката в съхранена процедура, компилирах 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);