Neo4jRule: Включить подключаемые модули алгоритмов (например, randomWalk) на тестовый сервер Neo4j - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь протестировать некоторую процедуру, которую я сделал, с помощью кода, предоставленного Neo4j для процедуры тестирования. Однако моя процедура основана на результатах алгоритма случайного блуждания, который я должен вызвать через algo.randomWalk.stream ().

Для этого я создаю экземпляр тестового сервера Neo4j. Однако он не распознает algo.randomWalk.stream (), потому что я думаю, что в его плагинах нет пакета алгоритма.

Это код, над которым я работаю


package example;

import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Rule;
import org.junit.Test;
import org.neo4j.driver.v1.*;
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import static org.neo4j.driver.v1.Values.parameters;


import java.io.File;
import java.util.HashMap;
import java.util.List;

import org.neo4j.harness.junit.Neo4jRule;


import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.*;
import static org.neo4j.driver.v1.Values.parameters;


public class ScoringTest {
    // This rule starts a Neo4j instance for us
    @Rule
    public Neo4jRule neo4j = new Neo4jRule()

            // This is the Procedure we want to test
            .withProcedure( Scoring.class );

    //org.neo4j.server.thirdparty_jaxrs_classes=org.neo4j.examples.server.unmanaged=/examples/unmanaged
    @Test
    public void shouldAllowReturningTheLastValue() throws Throwable
    {
        // This is in a try-block, to make sure we close the driver after the test
        try( Driver driver = GraphDatabase
                .driver( neo4j.boltURI() , Config.build().withEncryptionLevel( Config.EncryptionLevel.NONE ).toConfig() ) )
        {
            System.out.println(neo4j.boltURI().toString());
            // Given
            neo4j.withExtension(neo4j.boltURI().toString(), "..\\graph-algorithms-algo-3.5.4.0.jar");
            Session session = driver.session();
            String PATH = "..\\data\\data.json";
            File JSON_SOURCE = new File(PATH);

            List<HashMap<String,Object>> mss = new ObjectMapper().readValue(JSON_SOURCE, List.class);
            session.run("UNWIND {bulk} as row " + 
                    "CREATE (n:Users) " + 
                    "SET n += row.properties", parameters("bulk", mss ));
            for(int k = 0; k<9; k++) {
                PATH = "..\\data\\"+k+".json";
                mss = new ObjectMapper().readValue(JSON_SOURCE, List.class);
                JSON_SOURCE = new File(PATH);
                session.run("UNWIND {bulk} as row " + 
                        "MATCH (from:Users), (to:Clips) " + 
                        "WHERE ID(from) = toInt(row.from) AND ID(to) = toInt(row.to._key) " + 
                        "CREATE (from)-[rel:hasClipped]->(to) " + 
                        "SET rel += row.properties ", parameters("bulk", mss ));
            }

            // When
            Value result = session.run( "MATCH (n:Clips) WHERE ID(n) = 1038 " + 
                    "CALL algo.randomWalk.stream(ID(n), 2, 1) " + 
                    "YIELD nodeIds " + 
                    "UNWIND nodeIds as nodeId " + 
                    "MATCH (l:Clips)-[r:hasClipped]-(q:Users) " + 
                    "WHERE (ID(l) = nodeId) AND (ID(q) in nodeIds) " + 
                    "WITH collect({relation:r,Clip:l,User:q}) as res " + 
                    "RETURN res").single().get("res");
            System.out.println(result);
            // Then
            assertThat( result, equalTo( 0L ) );
        }
    }

}


Точная ошибка, которую я получаю: org.neo4j.driver.v1.exceptions.ClientException: Нет процедуры с именем algo.randomWalk.stream, зарегистрированной для этого экземпляра базы данных. Убедитесь, что вы правильно написали имя процедуры и что процедура развернута правильно.

Спасибо за ваше время и ваши будущие ответы, Syndorik

1 Ответ

0 голосов
/ 10 мая 2019

Итак, я нашел решение этой проблемы. Для объекта Neo4jRule есть опция, позволяющая изменить путь к каталогу плагина.

Например, я только что добавил эту конфигурацию в Neo4jRule, а затем мог вызвать библиотеку graphalgo:

public Neo4jRule neo4j = new Neo4jRule()

            // This is the Procedure we want to test
            .withProcedure( Scoring.class )
            .withConfig(GraphDatabaseSettings.plugin_dir, "PATH_TO_PLUGIN_DIR")
            .withConfig(GraphDatabaseSettings.procedure_unrestricted, "algo.*" );
...