neo4j根据程度在java中排序节点

时间:2015-03-12 00:20:00

标签: java sorting neo4j

我需要根据我的程序动态创建的程度对节点进行排序。

我尝试使用Collections.sort()但它抛出一个空指针异常。 nodeList 参数是我的程序创建的节点列表。我尝试了几种不同的配置,但它没有用。

private  void sortNodes(List<Node> nodeList){

    Collections.sort(nodeList, new GraphModel());
}

public int compare(Node n1, Node n2) {

    int n1Degree,n2Degree;

    try ( Transaction tx = graphDb.beginTx() ) {
        n1Degree = n1.getDegree();
        n2Degree = n2.getDegree();
        tx.success();

    }
    if(n1Degree<n2Degree){
        return -1;
    }
    else if(n1Degree==n2Degree){
        return 0;
    }
    else{
        return 1;
    }

}

编辑:我正在添加代码的相关部分。

public class GraphModel implements Comparator<Node> {

 GraphDatabaseService graphDb;
 List<Node> nodeList=new ArrayList<>();

 //constructor
 public GraphModel(String sentence, String MemoryName){

    Memory mem=new Memory();


    graphDb = new   GraphDatabaseFactory().newEmbeddedDatabase(mem.getMemoryAddress(MemoryName));

  registerShutdownHook( graphDb );

  ....
  some more code here without any problem
  nodeList populated without any problem
  ....
  sortNodes(nodeList);

  } //end of constructor 
}

Node类是Neo4j的Node类。

这是堆栈跟踪:第275行是&#34;尝试(事务tx = graphDb.beginTx()&#34;在上面的比较方法中。

Exception in thread "main" java.lang.NullPointerException
at GraphModel.GraphModel.compare(GraphModel.java:275)
at GraphModel.GraphModel.compare(GraphModel.java:22)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:351)
at java.util.TimSort.sort(TimSort.java:216)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1454)
at java.util.Collections.sort(Collections.java:175)
at GraphModel.GraphModel.highestDegreeNodes(GraphModel.java:137)
at GraphModel.GraphModel.<init>(GraphModel.java:130)
at com.company.Tester.main(Tester.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

1 个答案:

答案 0 :(得分:1)

您的代码并未经过深思熟虑。

排序应该在TX中进行,排序方法应该只是

public class NodeDegreeComparer implements Comparator<Node> {
  public int compare(Node n1, Node n2) {
    return Integer.compare(n1.getDegree(),n2.getDegree());
  }
}


  graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(PATH);
  registerShutdownHook( graphDb );

  try (Transaction tx = graphDb.beginTx()) {
     Collections.sort(nodeList, new NodeDegreeComparer());
     tx.success();
  }