Skip to content

Commit 4494477

Browse files
authored
Merge pull request #4992 from vnickolov/metric-config-casing-2.0
Metric config casing 2.0
2 parents 87045a4 + 6191b87 commit 4494477

File tree

4 files changed

+78
-1
lines changed

4 files changed

+78
-1
lines changed

algo/src/main/java/org/neo4j/gds/similarity/knn/KnnNodePropertySpecParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ private static List<KnnNodePropertySpec> fromMap(Map<String, String> userInput)
113113
SimilarityMetric similarityMetric;
114114
if (value != null) {
115115
try {
116-
similarityMetric = SimilarityMetric.valueOf(value);
116+
similarityMetric = SimilarityMetric.parse(value);
117117
knnNodeProperties.add(new KnnNodePropertySpec(key, similarityMetric));
118118
} catch (IllegalArgumentException ex) {
119119
throw new IllegalArgumentException(

algo/src/main/java/org/neo4j/gds/similarity/knn/metrics/SimilarityMetric.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,15 @@
2222
import org.neo4j.gds.api.nodeproperties.ValueType;
2323

2424
import static org.neo4j.gds.utils.StringFormatting.formatWithLocale;
25+
import static org.neo4j.gds.utils.StringFormatting.toUpperCaseWithLocale;
2526

2627
public enum SimilarityMetric {
2728
JACCARD, OVERLAP, COSINE, EUCLIDEAN, PEARSON, LONG_PROPERTY_METRIC, DOUBLE_PROPERTY_METRIC, DEFAULT;
2829

30+
public static SimilarityMetric parse(String value) {
31+
return SimilarityMetric.valueOf(toUpperCaseWithLocale(value));
32+
}
33+
2934
public static SimilarityMetric defaultMetricForType(ValueType valueType) {
3035
switch (valueType) {
3136
case LONG:

algo/src/test/java/org/neo4j/gds/similarity/knn/KnnNodePropertySpecParserTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@
2020
package org.neo4j.gds.similarity.knn;
2121

2222
import org.junit.jupiter.api.Test;
23+
import org.junit.jupiter.params.ParameterizedTest;
24+
import org.junit.jupiter.params.provider.Arguments;
25+
import org.junit.jupiter.params.provider.MethodSource;
2326
import org.neo4j.gds.similarity.knn.metrics.SimilarityMetric;
2427

2528
import java.util.List;
2629
import java.util.Map;
30+
import java.util.stream.Stream;
2731

2832
import static org.assertj.core.api.Assertions.assertThat;
2933
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -103,6 +107,26 @@ void shouldParseMap() {
103107
);
104108
}
105109

110+
@ParameterizedTest
111+
@MethodSource("metrics")
112+
void shouldAcceptMetricsRegardlessOfCase(String metric, SimilarityMetric expectedMetricValue) {
113+
var input = "property";
114+
assertThat(KnnNodePropertySpecParser.parse(Map.of(input, metric)))
115+
.singleElement()
116+
.extracting(KnnNodePropertySpec::metric)
117+
.isEqualTo(expectedMetricValue);
118+
}
119+
120+
public static Stream<Arguments> metrics() {
121+
return Stream.of(
122+
Arguments.of("cosine", SimilarityMetric.COSINE),
123+
Arguments.of("euCLIDean", SimilarityMetric.EUCLIDEAN),
124+
Arguments.of("jACcaRd", SimilarityMetric.JACCARD),
125+
Arguments.of("OVERLAP", SimilarityMetric.OVERLAP),
126+
Arguments.of("Pearson", SimilarityMetric.PEARSON)
127+
);
128+
}
129+
106130
@Test
107131
void shouldRefuseToParseEmptyList() {
108132
var input = List.of();
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright (c) "Neo4j"
3+
* Neo4j Sweden AB [http://neo4j.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Neo4j is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
package org.neo4j.gds.similarity.knn.metrics;
21+
22+
import org.junit.jupiter.params.ParameterizedTest;
23+
import org.junit.jupiter.params.provider.Arguments;
24+
import org.junit.jupiter.params.provider.MethodSource;
25+
26+
import java.util.stream.Stream;
27+
28+
import static org.assertj.core.api.Assertions.assertThat;
29+
30+
class SimilarityMetricTest {
31+
32+
@ParameterizedTest
33+
@MethodSource("metrics")
34+
void parse(String userInput, SimilarityMetric expectedMetric) {
35+
assertThat(SimilarityMetric.parse(userInput)).isEqualTo(expectedMetric);
36+
}
37+
38+
public static Stream<Arguments> metrics() {
39+
return Stream.of(
40+
Arguments.of("JACCARD", SimilarityMetric.JACCARD),
41+
Arguments.of("Jaccard", SimilarityMetric.JACCARD),
42+
Arguments.of("overlap", SimilarityMetric.OVERLAP),
43+
Arguments.of("cosinE", SimilarityMetric.COSINE),
44+
Arguments.of("Euclidean", SimilarityMetric.EUCLIDEAN),
45+
Arguments.of("pearson", SimilarityMetric.PEARSON)
46+
);
47+
}
48+
}

0 commit comments

Comments
 (0)