标题说明了一切。
在cypher中,camelcase用于标签。例如:Car
和:Bike
。 Label
的API文档在枚举中定义每个标签时使用大写,因此Label.CAR.name()
始终为CAR
,而不是Car
。
使用camelcase更适合cypher查询,但这与命名枚举成员的Java标准相冲突。这迫使我在我的图形数据库中使用Label.BIKE_SEAT
而不是Label.BikeSeat
之类的标签。我应该使用哪一个?
尽管使用大写字母作为枚举成员是用Java做的正确方法,但我仍然有点好奇为什么Neo4j的人决定将标签表示为枚举?
答案 0 :(得分:6)
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
答案 1 :(得分: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;
}
}
这对于GraphDatabaseService#findNodesByLabelAndProperty(Label, String, String)
等方法效果不佳,因为它似乎使用Label#name()
进行匹配而不是Label#toString()
,因此它不会匹配具有驼峰案例标签的节点db。
由于覆盖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;
}
}
在外部,使用以前的标签枚举不需要在客户端进行任何更改。