标题说明了一切.
在cypher中,camelcase用于标签.例如:Car和:Bike.API文档Label在枚举中定义每个标签时使用大写,因此Label.CAR.name()将始终是CAR,而不是Car.
使用camelcase更适合cypher查询,但这与命名枚举成员的Java标准相冲突.这迫使我使用标签Label.BIKE_SEAT而不是Label.BikeSeat我的图形数据库.我应该使用哪一个?
尽管使用大写字母作为枚举成员是在Java中使用它的正确方法,但我仍然有点好奇为什么Neo4j人然后决定将标签表示为枚举?
ORACLE DOC: Because they are constants, the names of an enum type's fields are in uppercase letters.
检查:http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
小智 3
为了遵守Java约定,我可以重写Enum#toString()并使用它,而不是Enum#name()不能重写它。然后每个成员都会有一个构造函数,其真实的 Neo4j 标签如图形数据库中所示:
public enum Label implements org.neo4j.graphdb.Label {
CAR("Car"),
BIKE("Bike"),
BUS("Bus");
private String name;
private Label(name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
这不适用于诸如GraphDatabaseService#findNodesByLabelAndProperty(Label, String, String)因为它似乎用于Label#name()匹配而不是Label#toString()因此它不会匹配数据库中具有驼峰式大小写标签的节点之类的方法。
由于重写Enum#toString()不起作用,并且 Neo4jLabel#name()在内部使用所有内容,因此我无论如何都需要重写它。所以我最终定义了一个Label能够重写的类Label#name():
public class Label implements org.neo4j.graphdb.Label {
public static final Label CAR = new Label("Car");
public static final Label BIKE = new Label("Bike");
public static final Label BUS = new Label("Bus");
private String name;
private Label(String name) {
this.name = name;
}
@Override
public String name() {
return name;
}
@Override
public String toString() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
从外部来看,使用以前的标签枚举在客户端不需要进行任何更改。