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.
 
@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