按路径长度排序 Java

Order by path length in Java

我有类似下图的东西:

g = new TinkerGraph()
v1 = g.addVertex([name: 'one'])
v2 = g.addVertex([name: 'two'])
v3 = g.addVertex([name: 'three'])
v4 = g.addVertex([name: 'four'])
v5 = g.addVertex([name: 'five'])
v1.addEdge('contains', v2)
v2.addEdge('contains', v3)
v3.addEdge('contains', v4)
v4.addEdge('contains', v5)

现在我想删除 v1 及其所有 "children"

v1.out('contains').loop(1){it.loops < 10}{true}.order{-it.a.path.toList().unique{a, b -> a <=> b}.size <=> it.b.path.toList().unique{a, b -> a <=> b}.size}.remove()
v1.remove()

(我必须将其从叶子中删除)

你能帮我把这个 Groovy 查询改写成 Java 吗? order{...} 部分有问题。不确定如何从 Pair<Vertex, Vertex>.

获取 path

如果您只需要删除父节点及其所有子节点,则不确定顺序是否重要。我写了一个 junit 测试,我认为它可以解决你的问题。

import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.tg.TinkerGraph;
import org.junit.Assert;
import org.junit.Test;
import java.util.Iterator;

public class SOTest {

    private static final String EDGE_LABEL = "contains";

    @Test
    public void testSomething(){
        Graph g = new TinkerGraph();

        Vertex v1 = createVertex(g, "name", "one");
        Vertex v2 = createVertex(g, "name", "two");
        Vertex v3 = createVertex(g, "name", "three");
        Vertex v4 = createVertex(g, "name", "four");
        Vertex v5 = createVertex(g, "name", "five");

        v1.addEdge(EDGE_LABEL, v2);
        v2.addEdge(EDGE_LABEL, v3);
        v3.addEdge(EDGE_LABEL, v4);
        v4.addEdge(EDGE_LABEL, v5);

        removeParentAndChildren(v1);

        Assert.assertEquals(g.getVertices().iterator().hasNext(), false);

    }

    private static void removeParentAndChildren(Vertex vertex) {
        final Iterator<Vertex> vertexIterator = vertex.getVertices(Direction.OUT, EDGE_LABEL).iterator();
        if(vertexIterator.hasNext()) {
            vertex.getVertices(Direction.OUT, EDGE_LABEL).forEach(SOTest::removeParentAndChildren);
        }
        vertex.remove();
    }

    private Vertex createVertex(final Graph g, final String key, final String value) {
        Vertex v = g.addVertex(null);
        v.setProperty(key, value);
        return v;
    }

}

我们最终使用这个:

new HawkularPipeline<>(v1)
  .as("start")
  .out(contains)
  .loop("start", (x) -> true, (x) -> true)
  .toList()
  .forEach {
     c -> c.remove();
   }