用java代码不用cql语句在遍历时获取此节点(path.endNode())的上一节点
发布于 6 年前 作者 zhangxianzeng 1578 次浏览 来自 问答

我看了youtube上Max De Marzi先生的视频,关于用neo4j实现类似规则引擎的决策树。他是把每一个节点都写成规则的形式比如A节点为age>=40.当输入的值大于等于40时可以通过A节点。现在有一个问题是比如A节点的下面连接的节点为B,C两个节点,A节点前面的节点是D,F节点,比如当D节点正确并且A节点正确时返回B节点而不能B,C节点都返回这才是我想要的结果,但是在这个案例中没有关于路径的判断,它的形式是不管D或者F那个节点正确只要A正确就会返回B,C节点。我现在想的是在每个路径上加一个标识,D节点到A节点的关系上的标识为1,只要当A节点到B节点的关系标识为1时才能返回B节点。我现在能够根据path.endNode()获取到标记时到的那个节点,现在我想要问的问题是如果根据path.endNode()获得此节点前面的节点,并且能够用path.endNode()来表示前面的那个节点 @Override public Iterable<Relationship> expand(Path path, BranchState branchState) { // 如果我们得到一个答案,停止遍历,我们找到了一个有效的路径。 if (path.endNode().hasLabel(Labels.Answer)) { return Collections.emptyList(); }

    // 如果我们有规则要评估,那就去做吧。
    if (path.endNode().hasRelationship(Direction.OUTGOING, RelationshipTypes.HAS)) {
        return path.endNode().getRelationships(Direction.OUTGOING, RelationshipTypes.HAS);
    }

    if (path.endNode().hasLabel(Labels.Rule)) {
        try {
            if (isTrue(path.endNode())) {
             
            	 List<Relationship> rels = new ArrayList<>();
            	
              
                 for (Relationship r : path.endNode().getRelationships(Direction.OUTGOING, RelationshipTypes.IS_TRUE)) {
                	for (Relationship m : path.endNode().getRelationships(Direction.OUTGOING, RelationshipTypes.IS_TRUE)) {//这个地方就是用来放前面那个节点的地方,现在只是一个错误的写法
				Object id1=	m.getProperty("id");获取此节点前面一个节点的关系中的id值
				
					
                	
                	 Object id = r.getProperty("id");获取此节点关系中的id值
                     if (id1.equals(id)) {两者比较,当此节点正确并且此节点路径中的关系id值与前面节点的关系id值相等时返回此节点应该走的路径
                         rels.add(r);
                	
                	
                 }
                	}
                	  }
                 
                 return rels;
            	//return path.endNode().getRelationships(Direction.OUTGOING, RelationshipTypes.IS_TRUE);
            } 

// else { // return path.endNode().getRelationships(Direction.OUTGOING, RelationshipTypes.IS_FALSE); // } } catch (Exception e) { // 不能继续这样! return Collections.emptyList(); } }

    // 否则,不知道该怎么做。
    return Collections.emptyList();
}

private boolean isTrue(Node rule) throws Exception {
        // 获取存储在节点中的规则的属性
        Map<String, Object> ruleProperties = rule.getAllProperties();
        String[] parameterNames = Magic.explode((String) ruleProperties.get("parameter_names"));
        Class<?>[] parameterTypes = Magic.stringToTypes((String) ruleProperties.get("parameter_types"));

        // 用相应的值填充参数数组
        Object[] arguments = new Object[parameterNames.length];
        for (int j = 0; j < parameterNames.length; ++j) {
            arguments[j] = Magic.createObject(parameterTypes[j], facts.get(parameterNames[j]));
        }

        // 用匹配类型设置参数
        ee.setParameters(parameterNames, parameterTypes);

        // 现在我们(扫描、解析、编译和加载)表达式。
        ee.cook((String)ruleProperties.get("expression"));

        return (boolean) ee.evaluate(arguments);
}
回到顶部