标题说明了一切。
在密码中,camelcase用于标签。例如CCD_ 1和CCD_。Label
的API文档在定义枚举中的每个标签时使用大写字母,因此Label.CAR.name()
将始终为CAR
,而不是Car
。
使用camelcase更适合于密码查询,但这与命名枚举成员的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
解决方案的第一种方法
为了遵守Java约定,我可以重写:Car
0,并使用它来代替不能重写的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;
}
}
这在GraphDatabaseService#findNodesByLabelAndProperty(Label, String, String)
之类的方法中不太好用,因为它似乎使用Label#name()
而不是Label#toString()
进行匹配,所以它不会匹配数据库中具有骆驼大小写标签的节点。
我的工作解决方案
由于重写Enum#toString()
不起作用,而且Neo4j在内部对所有内容都使用Label#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;
}
}
从外部来看,客户端不需要使用以前的标签枚举进行任何更改。