Neo4j: Index and Lables with SDN
5801 ワード
In model, in order to index some property, you should anotate it with @Index. SDN now adopt schema-based index policy, which means the Entity class name will be used as lable.
In the above codes, SDN will produce tow labels for this modle User, _User.
If we want multiply lables for a modle, we could do this by following
We can add lables for a node in extention
----------------------------------------------------------------------
But a failure comes in other modle using @Lables,
Model Cods
The reasons I guess is that I used legency Index type .
But,when I save a Task node by set it's lable, there is no error.
When comment this add lable command, error comes
Why?
Labels Set not initialized when using @Labels annotation
https://jira.spring.io/browse/DATAGRAPH-541
It turns out that this is a bug in SDN.
Good news is that I solved this problem by manually initilize @Labels filed in constuctor
References
http://graphaware.com/neo4j/2015/01/16/neo4j-graph-model-design-labels-versus-indexed-properties.html
http://stackoverflow.com/questions/22075802/spring-data-neo4j-3-0-0-labels-support
http://stackoverflow.com/questions/28272953/how-to-use-labels-spring-data-neo4j
http://stackoverflow.com/questions/28475023/how-to-add-labels-to-nodes-using-spring-data-neo4j
https://github.com/spring-projects/spring-data-neo4j/blob/15cc8418ed4d429a952b86f788717add8a93f76c/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java
@NodeEntity
@XmlRootElement
@JsonAutoDetect
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
@Indexed
private String name;
@Indexed(unique = true)
private String userId;
@Indexed
private String phoneNumber;
....
In the above codes, SDN will produce tow labels for this modle User, _User.
If we want multiply lables for a modle, we could do this by following
@Labels
private Set<String> lables;
public Set<String> getLables() {
return lables;
}
public void setLables(Set<String> lables) {
this.lables = lables;
}
public void addLable(String lable) {
if (this.lables == null)
this.lables = new HashSet<String>();
lables.add(lable);
}
public void delLable(String lable){
if(this.lables!=null & this.lables.contains(lable))
lables.remove(lable);
}
We can add lables for a node in extention
@Path("/addLable/active/{userName}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response activeUser(final @PathParam("userName") String userName) throws JSONException {
try (Transaction tx = template.getGraphDatabaseService().beginTx()) {
User user = userRepo.getUserByName(userName);
if(user != null){
user.addLable(FIFOLabels.ActiveUser.name());
userRepo.saveOnly(user);
}else{
return Response.status(Status.NOT_FOUND).entity("User doesn't exist").build();
}
tx.success();
}
return Response.status(Status.OK).entity(OK_MSG).build();
}
----------------------------------------------------------------------
But a failure comes in other modle using @Lables,
java.lang.NullPointerException
at org.springframework.data.neo4j.fieldaccess.
LabelFieldAccessorFactory$LabelFieldAccessor.setValue
(LabelFieldAccessorFactory.java:73)
at org.springframework.data.neo4j.fieldaccess.
DefaultEntityState.setValue(DefaultEntityState.java:113)
Model Cods
@Labels
private Set<String> lables;
public Set<String> getLables() {
return lables;
}
public void setLables(Set<String> lables) {
this.lables = lables;
}
public void addLable(String lable) {
if (this.lables == null)
this.lables = new HashSet<String>();
lables.add(lable);
}
public void delLable(String lable) {
if (this.lables != null & this.lables.contains(lable))
lables.remove(lable);
}
@Indexed(indexType = IndexType.POINT, indexName = "TaskLocation")
String wkt;
public void setLocation(float lon, float lat) {
this.wkt = String.format("POINT( %.2f %.2f )", lon, lat);
}
public Task() {
}
public Task(String taskId, String title, String description) {
this.taskId = taskId;
this.title = title;
this.description = description;
}
The reasons I guess is that I used legency Index type .
@Indexed(indexType = IndexType.POINT, indexName = "TaskLocation")
String wkt;
But,when I save a Task node by set it's lable, there is no error.
@Path("/addTask")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response addTask(Task task) {
logger.info("############# add new task ########################");
logger.info("task:" + task.toString());
task.addLable("NewTask");
taskRepo.saveOnly(task);
return Response.status(Status.OK).entity(OK_MSG).build();
}
When comment this add lable command, error comes
//task.addLable("NewTask");
Why?
Labels Set not initialized when using @Labels annotation
https://jira.spring.io/browse/DATAGRAPH-541
It turns out that this is a bug in SDN.
Good news is that I solved this problem by manually initilize @Labels filed in constuctor
public Task() {
this.lables = new HashSet<String>();
this.lables.add("Task");
this.lables.add("_Task");
}
References
http://graphaware.com/neo4j/2015/01/16/neo4j-graph-model-design-labels-versus-indexed-properties.html
http://stackoverflow.com/questions/22075802/spring-data-neo4j-3-0-0-labels-support
http://stackoverflow.com/questions/28272953/how-to-use-labels-spring-data-neo4j
http://stackoverflow.com/questions/28475023/how-to-add-labels-to-nodes-using-spring-data-neo4j
https://github.com/spring-projects/spring-data-neo4j/blob/15cc8418ed4d429a952b86f788717add8a93f76c/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java