求工具类,把record 转成 node(自定义的Node类) ,再转成对应的实体类
想要一个工具类,先把record 转成 node(自定义的Node类) ,再转成对应的实体类 Node结构如下: public class NodeDo { private Iterable<String> labels ; private Long id ; private Map properties ; } 实体类如下: public class SystemDo { private Long id ; private String NAME ; private Map entity ; } 希望能得到帮助。 thanks
2 回复
record解析到node,封装为json,然后json再转为实体类,是否可行?可以尝试一下。下面是封装JSON格式数据的方法可以参考:
/**
* @param driver:传入NEO4J_JAVA驱动
* @param statement:cypher
* @return
* @Description: TODO(检索)
*/
public static JSONObject searcher(Driver driver, String statement) {
if (OngdbHeartBeat.isRegister()) {
driver = NeoAccessor.ongdbHeartBeat.getReaderBlotMappingLocalDriver();
}
long startMill = System.currentTimeMillis();
JSONObject results = new JSONObject();
JSONArray resultArray = new JSONArray();
JSONObject arrayObject = new JSONObject();
JSONArray columns = new JSONArray();
JSONArray data = new JSONArray();
JSONObject dataObject = new JSONObject();
JSONObject graph = new JSONObject();
JSONArray relationships = new JSONArray();
JSONArray nodes = new JSONArray();
JSONArray properties = new JSONArray();
try (Session session = driver.session()) {
// Auto-commit transactions are a quick and easy way to wrap a read.
Result result = session.run(statement);
// Each Cypher execution returns a stream of records.
while (result.hasNext()) {
Record record = result.next();
// Values can be extracted from a record by index or name.
List<Pair<String, Value>> list = record.fields();
JSONObject propertiesPack = new JSONObject();
for (int i = 0; i < list.size(); i++) {
Pair<String, Value> stringValuePair = list.get(i);
if (!columns.contains(stringValuePair.key())) {
columns.add(stringValuePair.key());
}
Value value = stringValuePair.value();
if (value instanceof NodeValue) {
JSONObject objectNode = packNode(value.asNode());
if (!nodes.contains(objectNode)) {
nodes.add(objectNode);
}
} else if (value instanceof PathValue) {
JSONArray objectNodes = packNodeByPath(value.asPath());
objectNodes.forEach(node -> {
JSONObject nodeObj = (JSONObject) node;
if (!nodes.contains(nodeObj)) {
nodes.add(nodeObj);
}
});
JSONArray objectRelas = packRelations(value.asPath());
objectRelas.forEach(relation -> {
JSONObject relationObj = (JSONObject) relation;
if (!relationships.contains(relationObj)) {
relationships.add(relationObj);
}
});
} else {
propertiesPack.putAll(packStringValuePair(stringValuePair));
}
}
if (!propertiesPack.isEmpty()) {
properties.add(propertiesPack);
}
}
} catch (Exception e) {
e.printStackTrace();
}
graph.put("relationships", relationships);
graph.put("nodes", nodes);
graph.put("properties", properties);
dataObject.put("graph", graph);
data.add(dataObject);
arrayObject.put("data", data);
arrayObject.put("columns", columns);
resultArray.add(arrayObject);
results.put("results", resultArray);
results.put("totalNodeSize", nodes.size());
results.put("totalRelationSize", relationships.size());
long stopMill = System.currentTimeMillis();
long consume = (stopMill - startMill) / Integer.parseInt(String.valueOf(TimeUnit.MILL_SECOND_CV.getSymbolValue()));
logger.info("Neo4j driver searcher success!consume:" + consume + "s");
return results;
}
private static JSONObject packStringValuePair(Pair<String, Value> stringValuePair) {
String key = stringValuePair.key();
Value value = stringValuePair.value();
JSONObject object = new JSONObject();
if (value instanceof BooleanValue) {
object.put(key, value.asBoolean());
} else if (value instanceof FloatValue) {
object.put(key, value.asFloat());
} else if (value instanceof IntegerValue) {
// object.put(key, value.asInt());
object.put(key, value.asLong());
} else if (value instanceof ListValue) {
object.put(key, value.asList());
} else {
object.put(key, value.asString());
}
return object;
}
private static JSONArray packRelations(Path path) {
JSONArray arrayRelations = new JSONArray();
for (Relationship relationship : path.relationships()) {
arrayRelations.add(packRelation(relationship));
}
return arrayRelations;
}
private static JSONObject packRelation(Relationship relationship) {
JSONObject currentRelation = new JSONObject();
currentRelation.put("startNode", relationship.startNodeId());
currentRelation.put("id", relationship.id());
currentRelation.put("type", relationship.type());
currentRelation.put("endNode", relationship.endNodeId());
currentRelation.put("properties", JSONObject.parseObject(JSON.toJSONString(relationship.asMap())));
return currentRelation;
}
private static JSONArray packNodeByPath(Path path) {
JSONArray pathNodes = new JSONArray();
for (Node node : path.nodes()) {
pathNodes.add(packNode(node));
}
return pathNodes;
}
private static JSONObject packNode(Node node) {
JSONObject currentNode = new JSONObject();
currentNode.put("id", node.id());
currentNode.put("properties", JSONObject.parseObject(JSON.toJSONString(node.asMap())));
currentNode.put("labels", JSONArray.parseArray(JSON.toJSONString(node.labels())));
return currentNode;
}