SpringBoot集成neo4j示例

文章目录

    • SpringBoot集成neo4j
      • 配置
      • 测试
    • neo4j cypher常用语法
      • 创建
        • 创建node
        • 创建relationship
      • 查询
        • 1.查询节点
        • 2.查询两个节点的关系
        • 3.限制路径查询条件
      • 删除
      • 补充
        • 1.MATCH与OPTIONAL MATCH的区别
        • 2.常用的relationship函数

SpringBoot集成neo4j

配置

  • xml配置:
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-neo4jartifactId>
     <version>2.1.9.RELEASEversion>
dependency>
  • SpringBoot配置:
@SpringBootApplication
@EnableNeo4jRepositories
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

}

到这里SpringBoot配置完成,接下来是增删改查

  • 实体类
  1. 节点类
@Data
@NoArgsConstructor
@NodeEntity
public class Bill {

    @Id @GeneratedValue
    private Long id;

    @Property
    private Integer billNo;
    @Property
    private String name;
    @Property
    private BigDecimal quantity;

}
  1. 关系类
@RelationshipEntity(type = "MERGE")
@Data
@NoArgsConstructor
public class BillRelation {

    @Id
    @GeneratedValue
    private Long id;

    @Property
    private Integer billNo;
    @Property
    private Integer type;
    @Property
    private BigDecimal quantity;
	
    //开始节点
    @StartNode
    private BillNode startNode;
	
    //结束节点
    @EndNode
    private BillNode endNode;
}
  • dao
  1. 节点dao,和jpa一样,可以进行自定义查询或者使用jpa语法。
@Repository
public interface BillNodeRepository extends Neo4jRepository<BillNode,Long> {

    @Query("MATCH (p1:Bill ) where p1.billNo=1 return p1")
    BillNode findBillNodeByBillNo();

}
  1. 关系dao
@Repository
public interface BillRelationRepository extends Neo4jRepository<BillRelation,Long> {
	
    //查询两个节点的所有路径
    @Query("OPTIONAL MATCH (p1:Bill {billNo:1}),(p2:Bill {billNo:8}),p=(p1)-[:MERGE*..]->(p2) return p")
    List<BillRelation> findAllPath();

}

测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestApplicationTests {

    @Autowired
    private BillRelationRepository billRelationRepository;

    @Autowired
    private BillNodeRepository billNodeRepository;

    @Test
    public void testAdd() {
        //节点
        BillNode node1=new BillNode();
        node1.setName("bill1");
        node1.setBillNo(9);
        node1.setQuantity(new BigDecimal(15));
        billNodeRepository.save(node1);
        BillNode node2=new BillNode();
        node2.setName("bill2");
        node2.setBillNo(10);
        node2.setQuantity(new BigDecimal(7));
        billNodeRepository.save(node2);

		//关系
        BillRelation relation1=new BillRelation();
        relation1.setBillNo(10);
        relation1.setQuantity(new BigDecimal(15));
        relation1.setType(3);
        relation1.setStartNode(node1);
        relation1.setEndNode(node2);
        billRelationRepository.save(relation1);
    }

    
    @Test
    public void testQuery() {
        //自定义查询节点
        BillNode billNode = billNodeRepository.findBillNodeByBillNo();
        System.out.println(billNode);
        
        //jpa语法查询id为1的节点
        BillNode billNode1 = billNodeRepository.findById(1L).orElse(null);
        System.out.println(billNode1);
        
        //查询所有路径
        List<BillRelation> all = billRelationRepository.findAllPath();
        System.out.println(all);
    }
}

neo4j cypher常用语法

创建

创建node

CREATE (bill1:Bill {billNo:1,name:"节点1",quantity:'10'})

创建relationship


CREATE
  (baseBill)-[:MERGE {billNo:1,type:1,quantity:'10'}]->(truck1)

查询

1.查询节点

  1. 属性值billNo=1的节点
OPTIONAL MATCH (p1:Bill) where p1.billNo=1 return p1
  1. 内置id=1的节点
OPTIONAL MATCH (p1:Bill) where id(p1)=1 return p1

注:neo4j的内置属性需要通过函数调用

  1. 所有节点
MATCH (n) RETURN n LIMIT 25

2.查询两个节点的关系

  1. 从p1到p2节点的任意数量关系的可变长度路径
OPTIONAL MATCH (p1:Bill {billNo:1}),(p2:Bill {billNo:2}),p=(p1)-[*]->(p2) return p
  1. 最短路径
  • 所有最短路径
OPTIONAL MATCH (p1:Bill {billNo:1}),(p2:Bill {billNo:8}),p=allShortestPaths((p1)-[*..5]->(p2)) return p
  • 返回一条最短路径
OPTIONAL MATCH (p1:Bill {billNo:1}),(p2:Bill {billNo:8}),p=shortestPath((p1)-[*..5]->(p2)) return p

[...]这里为正则表达式

常用查询:

  • [*]`表示查询所有路径长度的relationship

  • [*1…10]`表示查询路径长度在1-10之间的relationship

  • [*…10]`表示查询路径长度10以内的relationship

  1. 所有关系
MATCH p=()--() RETURN p LIMIT 25

注:-->,<--,--代表关系的方向

3.限制路径查询条件

  1. 不经过属性值billNo为8的relationship
OPTIONAL MATCH (p1:Bill {billNo:1}),(p2:Bill {billNo:8}),p=(p1)-[*]->(p2) with *,relationships(p) as r where all(x in r where x.billNo<>8) return p
  1. 不经过属性值billNo为5的node
OPTIONAL MATCH (p1:Bill {billNo:1}),(p2:Bill {billNo:8}),p=(p1)-[*]->(p2)  where all(x in nodes(p) where x.billNo<>5) return p
  1. relationship类型为MERGE
OPTIONAL MATCH (p1:Bill {billNo:1}),(p2:Bill {billNo:8}),p=(p1)-[*]->(p2) with *,relationships(p) as r where all(x in r where type(x)='MERGE') return p

注:这里因为路径是list所以需要遍历

删除

  1. 删除type为MERGE的relationship
MATCH (n)
OPTIONAL MATCH (n)-[r:MERGE]-()
DELETE r
  1. 删除所有node和relationship
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r

补充

1.MATCH与OPTIONAL MATCH的区别

  • MATCH语句用于指定的模式检索数据库
  • OPTIONAL MATCH语句用于搜索模式中描述的匹配项,对于找不到的项,用null代替

2.常用的relationship函数

Function Description
relationships() 返回路径中的所有relationship列表
nodes() 返回路径中的所有node列表
startNode() 返回关系的开始节点
endNode() 返回关系的结束节点
properties() 返回关系或节点的所有属性,以map结构
type() 返回关系的类型
id() 返回关系或节点的id

更多的函数查看noe4j doc

你可能感兴趣的:(Spring,Boot)