python neo4j_Neo4j的Java和Python API

package com.demo.service.graph;

import com.demo.api.graph.Edge;

import com.demo.api.graph.GraphService;

import com.demo.api.graph.Triplet;

import com.demo.api.graph.Vertex;

import org.neo4j.driver.v1.*;

import org.neo4j.driver.v1.summary.ResultSummary;

import javax.annotation.PreDestroy;

import java.util.List;

import static org.neo4j.driver.v1.Values.parameters;

public class implements GraphService{

Driver driver = GraphDatabase.driver(

"bolt://server:7687", AuthTokens.basic("neo4j", "password"));

* 添加节点

* 如果已经存在,不添加新节点,计数器加一

*

* @param vertexType

* @param vertexNameList

*/

public void addVertex(String vertexType, final List vertexNameList) {

try (Session session = driver.session()) {

session.writeTransaction(tx -> {

for (String vertexName : vertexNameList) {

String cypher = "MERGE (v:$vertexType {name: '$vertexName'}) " +

"on create SET v.count = 1 " +

"on match SET v.count = v.count + 1 " +

"return v";

cypher = cypher.replace("$vertexType", vertexType).replace("$vertexName", vertexName);

ResultSummary resultSummary = tx.run(cypher,

parameters("vertexName", vertexName)).consume();

}

return "success";

});

}

}

* 添加关系

*

* @param edgeName

* @param vertexType

* @param vertexNameList

*/

public void addEdges(String edgeName, String vertexType, List vertexNameList) {

try (Session session = driver.session()) {

session.writeTransaction(tx -> {

for (String vertexNameSource : vertexNameList) {

for (String vertexNameDest : vertexNameList) {

if (vertexNameSource.equals(vertexNameDest)) {

continue;

}

String cypher = "MATCH (source:$vertexType {name: '$vertexNameSource'})" +

"MATCH (dest:$vertexType {name: '$vertexNameDest'}) " +

" MERGE (source)-[edge:$edgeName]->(dest) " +

"on create SET edge.count = 1 " +

"on match SET edge.count = edge.count + 1 " +

"return edge.count";

cypher = cypher.replace("$vertexType", vertexType)

.replace("$edgeName", edgeName)

.replace("$vertexNameSource", vertexNameSource)

.replace("$vertexNameDest", vertexNameDest);

ResultSummary resultSummary = tx.run(cypher,

parameters("vertexNameSource", vertexNameSource,

"vertexNameDest", vertexNameDest)).consume();

}

}

return "success";

});

}

}

* Suggest

*

* @param vertexType

* @param prefix

* @param pageSize

* @param pageNo

* @return

*/

public List suggestVertexNames(String vertexType, String prefix, int pageSize, int pageNo) {

try (Session session = driver.session()) {

String cypher = "MATCH (a:$vertexType) " +

" WHERE a.name =~ '(?i)$prefix.*' " +

" WITH a, SIZE((a)-[]->()) as r_size " +

" ORDER BY SIZE(a.name) asc, r_size desc " +

" RETURN a, r_size " +

" SKIP $skipSize LIMIT $maxSize";

int skipSize = pageNo * pageSize;

cypher = cypher.replace("$vertexType", vertexType)

.replace("$prefix", prefix.replace(".", "\.").replace("*", "\*"))

.replace("$maxSize", String.valueOf(pageSize))

.replace("$skipSize", String.valueOf(skipSize));

List nodeNames = session.run(cypher).list(record -> {

String name = record.get("a").get("name", "prefix");

return name;

}

);

return nodeNames;

}

}

* 查询关联节点

*

* @param vertexType

* @param vertexName

* @param maxSize

* @return

*/

public List queryRelatives(String vertexType, String vertexName, int maxSize) {

try (Session session = driver.session()) {

String cypher = "MATCH (a:$vertexType {name: '$vertexName'})-[r]->(b:$vertexType) " +

" RETURN a,r,b " +

" ORDER BY r.count desc,b.count desc " +

" LIMIT $maxSize ";

cypher = cypher.replace("$vertexType", vertexType)

.replace("$vertexName", vertexName)

.replace("$maxSize", String.valueOf(maxSize));

List triplets = session.run(cypher).list((record) -> {

Value a = record.get("a");

Vertex source = new Vertex(a.get("name", ""), a.get("count", 1L));

Value b = record.get("b");

Vertex dest = new Vertex(b.get("name", ""), b.get("count", 1L));

Value r = record.get("r");

Edge edge = new Edge(r.asRelationship().type(), r.get("count", 1L));

Triplet triplet = new Triplet(source, edge, dest);

return triplet;

});

return triplets;

}

}

@PreDestroy

public void preDestroy() {

driver.close();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值