我看了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);
}