2017-05-06 79 views
0

我想查询/遍历一个orientDB图,并且无法弄清楚如何在遍历期间进行过滤。遍历图和过滤

OTraverse traverse = txGraph.traverse(); 
     traverse.setMaxDepth(3); 
     for(OIdentifiable obj : traverse.fields("in_friend","in","out","out_friend").target(new ORecordId("#15:8")).predicate(new OCommandPredicate(){ 

      public Object evaluate(OIdentifiable iRecord, ODocument arg1, OCommandContext arg0) { 
       Vertex v = txGraph.getVertex(iRecord.getIdentity()); 
       if (iRecord.getClass().equals("person") || (v.getProperty("test")!= null && v.getProperty("test").toString().equals("continue"))){ 

        log.println(v.getProperty("test").toString()); 
        return true; 
       } 

       return false; 
      } 

该代码在节点#15:8(一个人)开始遍历,并沿着所有类型为“朋友”的边。我不完全相信我正在做这件事,但结果看起来是正确的(直到我包括谓词函数)

我现在想要做的是,只跟随那些类型为“朋友”的边和与具有值“继续”的属性“测试”

在此处的代码中使用谓词将在遇到任何不符合条件的Vertex或Edge时立即停止遍历。

有没有办法让它不遵循那些特定的边,而是继续沿着其他边搜索图? ETA:我试图用Java来做到这一点,并且更喜欢这种方式;我很开放,被告知为什么我不应该,强硬。

回答

0

有几个问题在这里:

  1. 你不知道,目前iRecord是一个顶点(也可能是边缘),所以下面没有多大意义:

    Vertex v = txGraph.getVertex(iRecord.getIdentity()); 
    
  2. 您正在检查.getClass(),但它返回的是iRecord的Java类,它可能只是ODocument。尝试更改您的代码,如下所示:

    ODocument doc = iRecord.getRecord(); 
    String className = doc.getSchemaClass().getName(); 
    Object prop = doc.field("test"); 
    if (className.equalsIgnoreCase("person") || (prop != null && prop.toString().equals("continue"))){ 
        return true; 
    }