<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-neo4jartifactId>
<version>2.1.9.RELEASEversion>
dependency>
@SpringBootApplication
@EnableNeo4jRepositories
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
到这里SpringBoot配置完成,接下来是增删改查
@Data
@NoArgsConstructor
@NodeEntity
public class Bill {
@Id @GeneratedValue
private Long id;
@Property
private Integer billNo;
@Property
private String name;
@Property
private BigDecimal quantity;
}
@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;
}
@Repository
public interface BillNodeRepository extends Neo4jRepository<BillNode,Long> {
@Query("MATCH (p1:Bill ) where p1.billNo=1 return p1")
BillNode findBillNodeByBillNo();
}
@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);
}
}
CREATE (bill1:Bill {billNo:1,name:"节点1",quantity:'10'})
CREATE
(baseBill)-[:MERGE {billNo:1,type:1,quantity:'10'}]->(truck1)
OPTIONAL MATCH (p1:Bill) where p1.billNo=1 return p1
OPTIONAL MATCH (p1:Bill) where id(p1)=1 return p1
注:neo4j的内置属性需要通过函数调用
MATCH (n) RETURN n LIMIT 25
OPTIONAL MATCH (p1:Bill {billNo:1}),(p2:Bill {billNo:2}),p=(p1)-[*]->(p2) return p
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
MATCH p=()--() RETURN p LIMIT 25
注:-->
,<--
,--
代表关系的方向
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
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
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所以需要遍历
MATCH (n)
OPTIONAL MATCH (n)-[r:MERGE]-()
DELETE r
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
Function | Description |
---|---|
relationships() | 返回路径中的所有relationship列表 |
nodes() | 返回路径中的所有node列表 |
startNode() | 返回关系的开始节点 |
endNode() | 返回关系的结束节点 |
properties() | 返回关系或节点的所有属性,以map结构 |
type() | 返回关系的类型 |
id() | 返回关系或节点的id |
更多的函数查看noe4j doc