Scoring { @UserFunction @Description("apoc.scoring.pareto(10, 20, 100, 11) applies a Pareto scoring function over the inputs") public double pareto( final @Name("minimumThreshold") long minimumThreshold, final @Name("eightyPercentValue") long eightyPercentValue, final @Name("maximumValue") long maximumValue, final @Name("score") long score) { if (score < minimumThreshold) { return 0.0d; } else { double alpha = Math.log((double) 5) / eightyPercentValue; double exp = Math.exp(-alpha * score); return maximumValue * (1 - exp); } }  @UserFunction @Description("apoc.scoring.existence(5, true) returns the provided score if true, 0 if false") double existence(
            final @Name("score") long score,
            final @Name("exists") boolean exists); @UserFunction @Description("apoc.scoring.pareto(10, 20, 100, 11) applies a Pareto scoring function over the inputs") double pareto(
            final @Name("minimumThreshold") long minimumThreshold,
            final @Name("eightyPercentValue") long eightyPercentValue,
            final @Name("maximumValue") long maximumValue,
            final @Name("score") long score);  }
@Test public void pareto() throws Exception { TestUtil.testResult(db, "UNWIND [0,1,2,8,10,100] as value RETURN value, apoc.scoring.pareto(2,8,10,value) as score", (r) -> { assertEquals(0d,r.next().get("score")); assertEquals(0d,r.next().get("score")); assertEquals(3.3d,(double)r.next().get("score"),0.1d); assertEquals(8d,r.next().get("score")); assertEquals(8.7,(double)r.next().get("score"),0.1d); assertEquals(10d,(double)r.next().get("score"),0.1d); }); }