Подтвердить что ты не робот

Neo4j по сравнению с mysql (как его можно улучшить?)

Это продолжение не может воспроизвести/проверить требования к производительности в базах данных графов и neo4j в книгах действий. Я обновил настройки и тесты и не хочу слишком сильно изменять исходный вопрос.

Вся история (включая скрипты и т.д.) находится на https://baach.de/Members/jhb/neo4j-performance-compared-to-mysql

Краткая версия: при попытке проверить утверждения производительности, сделанные в книге "База данных диаграмм", я пришел к следующим результатам (запрос на случайный набор данных, содержащий n людей, по 50 друзей):

My results for 100k people

depth    neo4j             mysql       python

1        0.010             0.000        0.000
2        0.018             0.001        0.000
3        0.538             0.072        0.009
4       22.544             3.600        0.330
5     1269.942           180.143        0.758

"*": только один запуск

My results for 1 million people

depth    neo4j             mysql       python

1        0.010             0.000        0.000
2        0.018             0.002        0.000
3        0.689             0.082        0.012
4       30.057             5.598        1.079
5     1441.397*          300.000        9.791

"*": только один запуск

Используя 1.9.2 на 64-битной ubuntu, я установил neo4j.properties с этими значениями:

neostore.nodestore.db.mapped_memory=250M
neostore.relationshipstore.db.mapped_memory=2048M

и neo4j-wrapper.conf с:

wrapper.java.initmemory=1024
wrapper.java.maxmemory=8192

Мой запрос к neo4j выглядит так (используя REST api):

start person=node:node_auto_index(noscenda_name="person123") match (person)-[:friend]->()-[:friend]->(friend) return count(distinct friend);

Node_auto_index на месте, очевидно

Есть ли что-нибудь, что я могу сделать для ускорения neo4j вверх (чтобы быть быстрее mysql)?

А также есть qaru.site/info/143944/... с той же проблемой.

4b9b3361

Ответ 1

Извините, вы не можете воспроизвести результаты. Тем не менее, на MacBook Air (1,8 ГГц i7, 4 ГБ оперативной памяти) с кучей 2 ГБ, кешем GCR, но без прогрева кешей и без какой-либо другой настройки с аналогичным набором данных (1 миллион пользователей, 50 друзей на человека), Я многократно получаю около 900 мс, используя Framework Traversal Framework 1.9.2:

public class FriendOfAFriendDepth4
{
    private static final TraversalDescription traversalDescription = 
         Traversal.description()
            .depthFirst()
            .uniqueness( Uniqueness.NODE_GLOBAL )
            .relationships( withName( "FRIEND" ), Direction.OUTGOING )
            .evaluator( new Evaluator()
            {
                @Override
                public Evaluation evaluate( Path path )
                {
                    if ( path.length() >= 4 )
                    {
                        return Evaluation.INCLUDE_AND_PRUNE;
                    }
                    return Evaluation.EXCLUDE_AND_CONTINUE;

                }
            } );

    private final Index<Node> userIndex;

    public FriendOfAFriendDepth4( GraphDatabaseService db )
    {
        this.userIndex = db.index().forNodes( "user" );
    }

    public Iterator<Path> getFriends( String name )
    {
        return traversalDescription.traverse( 
            userIndex.get( "name", name ).getSingle() )
                .iterator();
    }

    public int countFriends( String name )
    {
        return  count( traversalDescription.traverse( 
            userIndex.get( "name", name ).getSingle() )
                 .nodes().iterator() );
    }
}

Cypher медленнее, но не так близко, как вы предполагаете: примерно 3 секунды:

START person=node:user(name={name})
MATCH (person)-[:FRIEND]->()-[:FRIEND]->()-[:FRIEND]->()-[:FRIEND]->(friend)
RETURN count(friend)

С уважением

Иан

Ответ 2

Да, я считаю, что REST API значительно медленнее, чем обычные привязки, и в этом заключается ваша проблема с производительностью.