Search in sources :

Example 11 with PathExpander

use of org.neo4j.graphdb.PathExpander in project neo4j by neo4j.

the class TestShortestPath method makeSureAMaxResultCountIsObeyed.

@Test
void makeSureAMaxResultCountIsObeyed() {
    // 
    try (Transaction transaction = graphDb.beginTx()) {
        graph.makeEdgeChain(transaction, "a,b,c,d,e");
        graph.makeEdgeChain(transaction, "a,f,g,h,e");
        graph.makeEdgeChain(transaction, "f,i,j,e");
        graph.makeEdgeChain(transaction, "i,k,e");
        final Node a = graph.getNode(transaction, "a");
        final Node e = graph.getNode(transaction, "e");
        final PathExpander expander = forTypeAndDirection(R1, OUTGOING);
        var context = new BasicEvaluationContext(transaction, graphDb);
        testShortestPathFinder(context, finder -> assertEquals(4, count(finder.findAllPaths(a, e))), expander, 10, 10);
        for (int i = 4; i >= 1; i--) {
            final int count = i;
            testShortestPathFinder(context, finder -> assertEquals(count, count(finder.findAllPaths(a, e))), expander, 10, count);
        }
        transaction.commit();
    }
}
Also used : BasicEvaluationContext(org.neo4j.graphalgo.BasicEvaluationContext) Transaction(org.neo4j.graphdb.Transaction) Node(org.neo4j.graphdb.Node) PathExpander(org.neo4j.graphdb.PathExpander) Test(org.junit.jupiter.api.Test)

Example 12 with PathExpander

use of org.neo4j.graphdb.PathExpander in project neo4j by neo4j.

the class TestShortestPath method filtersTouchesAllIntermediateNodes.

@Test
void filtersTouchesAllIntermediateNodes() {
    // 
    try (Transaction transaction = graphDb.beginTx()) {
        graph.makeEdgeChain(transaction, "a,b,c,d");
        final Node a = graph.getNode(transaction, "a");
        final Node d = graph.getNode(transaction, "d");
        Collection<Node> touchedByFilter = new HashSet<>();
        final Predicate<Node> filter = item -> {
            touchedByFilter.add(item);
            return true;
        };
        final PathExpander expander = PathExpanderBuilder.empty().add(R1, OUTGOING).addNodeFilter(filter).build();
        // final PathExpander expander = ((StandardExpander) PathExpanders.forTypeAndDirection(R1, OUTGOING)).addNodeFilter( filter );
        var context = new BasicEvaluationContext(transaction, graphDb);
        Path path = Iterables.single(shortestPath(context, expander, 10).findAllPaths(a, d));
        assertEquals(3, path.length());
        List<Node> nodes = Iterables.asList(path.nodes());
        List<Node> intermediateNodes = nodes.subList(1, nodes.size() - 1);
        assertTrue(touchedByFilter.containsAll(intermediateNodes), "touchedByFilter: " + touchedByFilter);
        assertFalse(touchedByFilter.contains(a));
        assertFalse(touchedByFilter.contains(d));
        transaction.commit();
    }
}
Also used : ResourceIterator(org.neo4j.graphdb.ResourceIterator) MutableInt(org.apache.commons.lang3.mutable.MutableInt) Label(org.neo4j.graphdb.Label) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) PathFinder(org.neo4j.graphalgo.PathFinder) OUTGOING(org.neo4j.graphdb.Direction.OUTGOING) GraphAlgoFactory.shortestPath(org.neo4j.graphalgo.GraphAlgoFactory.shortestPath) EmptyMemoryTracker(org.neo4j.memory.EmptyMemoryTracker) PathExpanders(org.neo4j.graphdb.PathExpanders) Node(org.neo4j.graphdb.Node) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) BOTH(org.neo4j.graphdb.Direction.BOTH) EvaluationContext(org.neo4j.graphalgo.EvaluationContext) PathExpanderBuilder(org.neo4j.graphdb.PathExpanderBuilder) Assertions.assertFalse(org.junit.jupiter.api.Assertions.assertFalse) PathExpander(org.neo4j.graphdb.PathExpander) Iterables(org.neo4j.internal.helpers.collection.Iterables) Arrays.asList(java.util.Arrays.asList) R1(common.Neo4jAlgoTestCase.MyRelTypes.R1) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) Transaction(org.neo4j.graphdb.Transaction) StandardExpander(org.neo4j.graphdb.impl.StandardExpander) Iterator(java.util.Iterator) Iterables.count(org.neo4j.internal.helpers.collection.Iterables.count) Predicate(java.util.function.Predicate) Collection(java.util.Collection) Set(java.util.Set) Neo4jAlgoTestCase(common.Neo4jAlgoTestCase) INCOMING(org.neo4j.graphdb.Direction.INCOMING) BranchState(org.neo4j.graphdb.traversal.BranchState) Test(org.junit.jupiter.api.Test) Path(org.neo4j.graphdb.Path) PathExpanders.forTypeAndDirection(org.neo4j.graphdb.PathExpanders.forTypeAndDirection) List(java.util.List) Relationship(org.neo4j.graphdb.Relationship) Assertions.assertTrue(org.junit.jupiter.api.Assertions.assertTrue) PathExpanders.allTypesAndDirections(org.neo4j.graphdb.PathExpanders.allTypesAndDirections) RelationshipType(org.neo4j.graphdb.RelationshipType) BasicEvaluationContext(org.neo4j.graphalgo.BasicEvaluationContext) GraphAlgoFactory.shortestPath(org.neo4j.graphalgo.GraphAlgoFactory.shortestPath) Path(org.neo4j.graphdb.Path) BasicEvaluationContext(org.neo4j.graphalgo.BasicEvaluationContext) Transaction(org.neo4j.graphdb.Transaction) Node(org.neo4j.graphdb.Node) PathExpander(org.neo4j.graphdb.PathExpander) HashSet(java.util.HashSet) Test(org.junit.jupiter.api.Test)

Example 13 with PathExpander

use of org.neo4j.graphdb.PathExpander in project neo4j by neo4j.

the class TraversalBranchImplTest method shouldExpandOnFirstAccess.

@SuppressWarnings("unchecked")
@Test
void shouldExpandOnFirstAccess() {
    // GIVEN
    TraversalBranch parent = mock(TraversalBranch.class);
    Node source = mock(Node.class);
    TraversalBranchImpl branch = new TraversalBranchImpl(parent, source);
    @SuppressWarnings("rawtypes") PathExpander expander = mock(PathExpander.class);
    when(expander.expand(eq(branch), any(BranchState.class))).thenReturn(Iterables.emptyResourceIterable());
    TraversalContext context = mock(TraversalContext.class);
    when(context.evaluate(eq(branch), isNull())).thenReturn(INCLUDE_AND_CONTINUE);
    // WHEN initializing
    branch.initialize(expander, context);
    // THEN the branch should not be expanded
    verifyNoInteractions(source);
    // and WHEN actually traversing from it
    branch.next(expander, context);
    // THEN we should expand it
    verify(expander).expand(any(Path.class), any(BranchState.class));
}
Also used : Path(org.neo4j.graphdb.Path) Node(org.neo4j.graphdb.Node) PathExpander(org.neo4j.graphdb.PathExpander) TraversalContext(org.neo4j.graphdb.traversal.TraversalContext) BranchState(org.neo4j.graphdb.traversal.BranchState) TraversalBranch(org.neo4j.graphdb.traversal.TraversalBranch) Test(org.junit.jupiter.api.Test)

Aggregations

PathExpander (org.neo4j.graphdb.PathExpander)13 Node (org.neo4j.graphdb.Node)12 Transaction (org.neo4j.graphdb.Transaction)8 Path (org.neo4j.graphdb.Path)6 Test (org.junit.jupiter.api.Test)5 Relationship (org.neo4j.graphdb.Relationship)5 Test (org.junit.Test)4 BranchState (org.neo4j.graphdb.traversal.BranchState)4 BasicEvaluationContext (org.neo4j.graphalgo.BasicEvaluationContext)3 WeightedPath (org.neo4j.graphalgo.WeightedPath)3 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 TraversalAStar (org.neo4j.graphalgo.impl.path.TraversalAStar)2 PathExpanderBuilder (org.neo4j.graphdb.PathExpanderBuilder)2 OrderedByTypeExpander (org.neo4j.graphdb.impl.OrderedByTypeExpander)2 Neo4jAlgoTestCase (common.Neo4jAlgoTestCase)1 R1 (common.Neo4jAlgoTestCase.MyRelTypes.R1)1 Arrays.asList (java.util.Arrays.asList)1 Collection (java.util.Collection)1 HashSet (java.util.HashSet)1