2016-12-10 5 views

Antwort

4

Sie Ihre eigene Java procedures in Neo4j schreiben können und sie von Cypher nennen.

Für die Regressionsfunktion können wir Apache Commons SimpleRegression Klasse verwenden.

Der folgende Code erstellt das Verfahren mit dem Namen regr und gibt grundlegende Regressionswerte für gegebene X- und Y-Eigenschaften zurück.

Sie können diese Prozedur von Cypher nennen wie: regr('MY_LABEL', 'Y', 'X')

public class Regression { 
@Context public GraphDatabaseService db; 

// Result class 
public static class Output { 
    public double r2; 
    public double avg_x; 
    public double avg_y; 
    public double slope; 
    public Output(double r2, double avg_x, double avg_y, double slope){ 
     this.r2 = r2; 
     this.avg_x = avg_x; 
     this.avg_y = avg_y; 
     this.slope = slope; 
    } 
} 

@Procedure("regr") 
public Stream<Output> regr(@Name("label") String label, 
          @Name("property_y") String y, @Name("property_x") String x) { 

    SimpleRegression regr = new SimpleRegression(false); 
    double regr_avgx = 0; 
    double regr_avgy = 0; 
    int count = 0; 

    try (ResourceIterator it = db.findNodes(Label.label(label))) { 
     while (it.hasNext()) { 
      Node node = (Node)it.next(); 
      if(node.hasProperty(x) && node.hasProperty(y)) 
      { 
       Object prop_x = node.getProperty(x); 
       Object prop_y = node.getProperty(y); 

       regr_avgx += (double) ((Long)prop_x); 
       regr_avgy += (double) ((Long)prop_y); 
       regr.addData((double) ((Long)prop_x), (double) ((Long)prop_y)); 
       count++; 
      } 
     } 
    } 
    regr_avgx /= count; 
    regr_avgy /= count; 
    return Stream.of(new Output(regr.getRSquare(), regr_avgx, regr_avgy, regr.getSlope())); 
} 
} 
+1

btw. es scheint, du bist beide in Bonn, Deutschland :) –