MiracleTanC / Neo4j-KGBuilder

Neo4j+springboot+vue+d3.js知识图谱构建和可视化
1.15k stars 413 forks source link

KGraphRepository的getdomaingraph方法的”n.name“是硬编码啊? #4

Open d470969047h opened 5 years ago

d470969047h commented 5 years ago

public HashMap<String, Object> getdomaingraph(GraphQuery query) { HashMap<String, Object> nr = new HashMap<String, Object>(); try { String domain = query.getDomain(); // MATCH (n:症状) -[r]-(m:症状) where r.name='治疗' or r.name='危险因素' return n,m if (!StringUtil.isBlank(domain)) { String cqr = ""; List lis = new ArrayList(); if (query.getRelation() != null && query.getRelation().length > 0) { for (String r : query.getRelation()) { String it = String.format("r.name='%s'", r); lis.add(it); } cqr = String.join(" or ", lis); } String cqWhere = ""; if (!StringUtil.isBlank(query.getNodename()) || !StringUtil.isBlank(cqr)) {

                if (!StringUtil.isBlank(query.getNodename())) {
                    if (query.getMatchtype() == 1) {
                        cqWhere = String.format("where n.name ='%s' ", query.getNodename());

                    } else {
                        cqWhere = String.format("where n.name contains('%s')", query.getNodename());
                    }
                }
                String nodeOnly = cqWhere;
                if (!StringUtil.isBlank(cqr)) {
                    if (StringUtil.isBlank(cqWhere)) {
                        cqWhere = String.format(" where ( %s )", cqr);

                    } else {
                        cqWhere += String.format(" and ( %s )", cqr);
                    }

                }
                // 下边的查询查不到单个没有关系的节点,考虑要不要左箭头
                String nodeSql = String.format("MATCH (n:`%s`) <-[r]->(m) %s return * limit %s", domain, cqWhere,
                        query.getPageSize());
                HashMap<String, Object> graphNode = neo4jUtil.GetGraphNodeAndShip(nodeSql);
                Object node = graphNode.get("node");
                // 没有关系显示则显示节点
                if (node != null) {
                    nr.put("node", graphNode.get("node"));
                    nr.put("relationship", graphNode.get("relationship"));
                } else {
                    String nodecql = String.format("MATCH (n:`%s`) %s RETURN distinct(n) limit %s", domain,
                            nodeOnly, query.getPageSize());
                    List<HashMap<String, Object>> nodeItem = neo4jUtil.GetGraphNode(nodecql);
                    nr.put("node", nodeItem);
                    nr.put("relationship", new ArrayList<HashMap<String, Object>>());
                }
            } else {
                String nodeSql = String.format("MATCH (n:`%s`) %s RETURN distinct(n) limit %s", domain, cqWhere,
                        query.getPageSize());
                List<HashMap<String, Object>> graphNode = neo4jUtil.GetGraphNode(nodeSql);
                nr.put("node", graphNode);
                String domainSql = String.format("MATCH (n:`%s`)<-[r]-> (m) %s RETURN distinct(r) limit %s", domain,
                        cqWhere, query.getPageSize());// m是否加领域
                List<HashMap<String, Object>> graphRelation = neo4jUtil.GetGraphRelationShip(domainSql);
                nr.put("relationship", graphRelation);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return nr;
}
MiracleTanC commented 5 years ago

建模的时候写的是name,对应的图数据库节点的name,这个是自定义封装的,取决与你建模时候的字段,但是考虑到Neo4j broswer里 默认显示的是name,所以建模和封装工具类的时候就默认了name

d470969047h commented 5 years ago

@MiracleTanC 嗯嗯,如果我想在项目里直接建中文的字段这里就会报错了吧? eg: name=知识图谱 (目前系统), 名称=知识图谱 (我建的节点是这个会有问题吧?)

另外,我看了咱们这个项目的No4jUtil这个类,有的命名不是很规范;有的类好像没有用但是放在那里了