springboot 통합 neo4j

4288 단어 자바neo4j
프로젝트 는 자바 로 neo4j 그래프 를 관리 해 야 합 니 다.스스로 springboot 를 사용 하여 neo4j 를 통합 시 키 고 노드 와 관계 관 리 를 실현 하 는 demo.
수요 설명:노드 는 enity,content,param 등 유형 이 있 지만 모든 노드 에 node 유형 이 있어 야 합 니 다.즉,두 개의 labels 속성 이 있어 야 합 니 다.
pom.xml

	org.springframework.boot
	spring-boot-starter-data-neo4j



	org.neo4j
	neo4j-ogm-http-driver


	org.springframework.boot
	spring-boot-starter-test
	test

application.yml
spring:
  data:
    neo4j:
      uri: http://127.0.0.1:7474
      username: neo4j
      password: pactera

@labels 주석 사용 하기
@labels 주석 은 spring-data-no4j 문서 에서 찾 았 습 니 다(https://docs.spring.io/spring-data/data-neo4j/docs/current/reference/html/)。이렇게 하면 노드 를 만 들 때 임의의 lables 를 추가 할 수 있 습 니 다.
@NodeEntity(label="entity")
@Data
public class EntityNode  {
	public EntityNode() {
		List labels = new ArrayList<>();
		labels.add("node");
		labels.add("entity");
		this.setLabels(labels);
	}	

	@GeneratedValue
	@Id
	private Long id;
    
	@Labels
    private List labels ;
	
	public String nodeId;
	
	public String nodeName;

	private String[] concepts;
	
	private String regex;
	//     
	@Property(name="default")
	private String defaultJump;
}
//   Neo4jRepository 
public interface EntityRepository extends Neo4jRepository {

	EntityNode findByNodeId(@Param("nodeId") String NodeId);
}

이렇게 하면 이해 하고 실현 하기 쉽 지만 많은 문제점 이 존재 합 니 다.@NodeEntity 에서 label="enity"이기 때문에 Entity Repository 에서 이 루어 진 함 수 는 모두 enity 유형의 노드 를 대상 으로 합 니 다.예 를 들 어 nodeRepository.findAll()함수 대응 실행 문 구 는'statement':'MATCH(n:'entity')RETURN n'이다.그렇다면 아 이 디 를 드 리 겠 습 니 다.구체 적 인 유형 을 모 르 면 엔 터 티 Repository,contentRepository,paramRepository 를 사용 해 야 합 니까?
상속 사용
@NodeEntity 주석 원본 코드
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface NodeEntity {

    String LABEL = "label";

    String label() default "";
}

그때 저도 이 문제 에 곤 혹 스 러 웠 습 니 다.마지막 으로@NodeEntity 주해 에@Inherited 주해 가 있 는 것 을 발 견 했 습 니 다.계승 을 사용 할 수 있 을 까 생각 했 습 니 다.
부모 클래스 node,노드 의 공공 속성 을 정의 합 니 다.(자신의 코드 에서 부모 클래스 는@Data 가 아 닌 get,set 방법 을 사용 합 니 다)
@NodeEntity(label="node")
@Data
public class Node implements Serializable{
	
	private static final long serialVersionUID = 942659633583923942L;

	@GeneratedValue
	@Id
	private Long id;
	
	public String nodeId;
	
	public String nodeName;
	
}

public interface NodeRepository  extends Neo4jRepository  {

}

하위 클래스,구체 클래스 의 구체 적 속성
@NodeEntity(label="entity")
@Data
@EqualsAndHashCode(callSuper=false)
public class EntityNode extends Node {

	private static final long serialVersionUID = -3441407202518609463L;
	
	private String[] concepts;
	
	private String regex;
	
	@Property(name="default")
	private String defaultJump;
}


public interface EntityRepository extends Neo4jRepository {

	EntityNode findByNodeId(@Param("nodeId") String NodeId);
}

EntityRepository 를 사용 하여 enity 형식 노드 만 들 기
    @Test
	@Rollback(false)
	public void createNode() {
		EntityNode entityNode= new EntityNode();
		entityNode.setNodeId("test001");
		entityNode.setNodeName("  1");
		entityNode.setRegex("123123123131");
		entityRepository.save(entityNode);
	}
//     
{"statement":"UNWIND {rows} as row CREATE (n:`entity`:`node`) SET n=row.props RETURN row.nodeRef as ref, ID(n) as id, {type} as type

nodeRepository 를 사용 하여 임의의 형식의 노드 를 삭제 합 니 다.
    @Test
	@Rollback(false)
	public  void deleteById() {
		nodeRepository.deleteById(1488l);
	}
//     
{"statement":"MATCH (n:`node`) WHERE ID(n) = { id } WITH n RETURN n"}
{"statement":"MATCH (n) WHERE ID(n) = { id } OPIONAL MATCH (n)-[r0]-() DELETE r0, n"}

좋은 웹페이지 즐겨찾기