2016-09-28 1 views
0

В настоящее время выполняется сравнительный эксперимент для некоторых алгоритмов, выполняющихся поверх реляционной базы данных (PostgreSQL) и графического (Neo4j). Я реализовал свой алгоритм как пользовательскую процедуру для Neo4j, но не похоже, что он выполняет кеширование из коробки. Есть ли способ настроить кеширование для пользовательских процедур в Neo4j?Кэширование для пользовательских процедур Neo4j

Благодаря

ответ

0

Вы должны реализовать кэширование самостоятельно, если это актуально для вашего случая использования и у вас есть что-то кэшировать: вероятно, что-то не связанные со сделкой, так что никаких узлов или связей; Ионы Neo4j сложны, поскольку их можно использовать повторно, поэтому, вероятно, лучше всего их кэшировать на короткое время или вообще не использовать. Идентификаторы уровня приложения были бы точными, как и бины, состоящие из строк или скалярных типов.

Предположим, у вас есть эта процедура определено:

public class MyProcedure { 
    @Context 
    public GraphDatabaseService db; 

    @Procedure 
    public Stream<MyBean> doSomething(@Name("uuid") String uuid) { 
     int count = 0; 
     // ... 
     return Stream.of(new MyBean(count)); 
    } 

    public static class MyBean { 
     public int count; 

     public MyBean(int count) { 
      this.count = count; 
     } 
    } 
} 

Вы можете добавить некоторые простые кэширования с помощью ConcurrentMap:

public class MyProcedure { 
    private static final ConcurrentMap<String, Collection<MyBean>> CACHE = 
      new ConcurrentHashMap<>(); 

    @Context 
    public GraphDatabaseService db; 

    @Procedure 
    public Stream<MyBean> doSomething(@Name("uuid") String uuid) { 
     Collection<MyBean> result = CACHE.computeIfAbsent(uuid, 
       k -> doSomethingCacheable(k).collect(Collectors.toList())); 
     return result.stream(); 
    } 

    private Stream<MyBean> doSomethingCacheable(String uuid) { 
     int count = 0; 
     // ... 
     return Stream.of(new MyBean(count)); 
    } 

    public static class MyBean { 
     // ... 
    } 
} 

Обратите внимание, что вы не можете кэшировать Stream, как это можно употреблять только один раз, так что вам придется потреблять его самостоятельно, собирая в ArrayList (вы также можете переместить collect внутри метода, изменить тип возврата на Collection<MyBean> и использовать ссылку на метод). Если процедура принимает более одного аргумента, вам нужно создать правильный класс для составного ключа (неизменяемый, если это возможно, с правильной реализацией equals и hashCode). К ключам применяются также ограничения, применимые к кешируемым значениям.

Это вечный неограниченный кеш. Если вам нужно больше возможностей (срок действия, максимальный размер), я предлагаю использовать реальную реализацию кеша, например GuavaCache (или LoadingCache) или Ben Manes 'Caffeine.

+0

Спасибо, я надеялся, что есть что-то из коробки, поэтому я также могу сравнить реализации кэширования, но попробую один из предложенных вами библиотек вместо того, что я сделал сам. –

Смежные вопросы