2016-03-20 21 views
1

我正在尝试在OrientDB图中存储DNS层次结构的想法,并且无法找到为给定域添加新顶点的适当位置。在OrientDB中搜索已知路径

我开始用这种结构:

CREATE CLASS Zone EXTENDS V 
CREATE CLASS Subdomain_of EXTENDS E 
CREATE VERTEX Zone CONTENT {name: '.'}  #12:0 
CREATE VERTEX Zone CONTENT {name: 'com'}  #12:1 
CREATE VERTEX Zone CONTENT {name: 'net'}  #12:2 
CREATE VERTEX Zone CONTENT {name: 'org'}  #12:3 
CREATE VERTEX Zone CONTENT {name: 'example'} #12:4 
CREATE VERTEX Zone CONTENT {name: 'www'}  #12:5 
CREATE EDGE Subdomain FROM #12:1 TO #12:0 
CREATE EDGE Subdomain FROM #12:2 TO #12:0 
CREATE EDGE Subdomain FROM #12:3 TO #12:0 
CREATE EDGE Subdomain FROM #12:4 TO #12:1 
CREATE EDGE Subdomain FROM #12:5 TO #12:4 

Example DNS Hierarchy

我想创建一个保存的功能,将采取一个域名字符串作为输入,并添加相关的子域图形。

想象一下,我想添加域名“mail.example.com”。该功能需要先搜索以查看.com.example.mail路径是否存在 - 如果不存在,则应检查.com.example并将具有子域边缘的“mail”的新顶点添加到“example”顶点。

有没有基于特定路径搜索叶节点的方法?一个类似于的Neo4j/Cypher支架语法:

MATCH 
(:Zone {name: ‘.’})<-[Subdomain]-(:Zone {name: ‘com’})<-[:Subdomain]-(a:Zone {name: ‘example’}) 
RETURN (ID(a)) 

感谢,

查尔斯

+0

关于功能,你在Java或Javascript中开发更有用吗? 我不明白'你要搜索一个叶节点'是什么意思,你想要搜索,例如有一个叫做“www”的“顶点叶”? – lsavio

回答

1

有了这个Java函数,如果不存在应添加新的顶点。

public class DomainInternet { 

    static final String REMOTE = "remote:localhost/"; 
    static final String NOMEDB = "domain"; // 2.1.9 community 
    static final String CURRENTPATH = REMOTE + NOMEDB; 

    public static void main(String[] args) { 

     OrientGraphNoTx g = new OrientGraphFactory(CURRENTPATH).getNoTx(); 

     addDomain(g, "mail.example.com"); 

     System.out.println("End!"); 
    } 

    public static void addDomain(OrientGraphNoTx g, String newDomain) { 

     // ---------------------check if path is already present 
     // put in a list the single word 
     List<String> listDomain = new ArrayList<String>(Arrays.asList(newDomain.split("([.])"))); 
     //reverse = "com; example; mail" 
     Collections.reverse(listDomain); 


     //set variable used by query to find if domain is already present 
      Iterable<Vertex> level = null; 
      List<OrientVertex> listaVertex = new ArrayList<OrientVertex>();  
      String queryFirst = "select expand(in('Subdomain_of')) from Zone where name = "; 
      String name = ""; 
      boolean finded = false; 
     //set variable used by add new domain 
      OrientVertex addVertex; 
      String nodePrec = "."; 



     for(int i=0; i<listDomain.size(); i++) { 
      //from "." 
      level = g.command(new OSQLSynchQuery<Vertex>(queryFirst+"'"+nodePrec+"'")).execute(); 
      CollectionUtils.addAll(listaVertex, level.iterator()); 

      for (int ind = 0; ind<listaVertex.size(); ind++) { 
       name = listaVertex.get(ind).getProperty("name"); 

       if(name.equals(listDomain.get(i))){ 
        finded = true; 
        break; 
       } 
      } 
      // if not finded 
      if (!finded) { 

       //add vertex 
       addVertex = g.addVertex("class:Zone"); 
       addVertex.setProperties("name", listDomain.get(i)); 

       //add edge 
       Map<String, Vertex> vertices = new HashMap<String, Vertex>(); 
       for (Vertex v : g.getVertices()){ 
        vertices.put(v.getProperty("name").toString(), v); 
       } 

       g.addEdge("class:Subdomain_of", vertices.get(listDomain.get(i)), vertices.get(nodePrec), "Subdomain_of"); 
      } 

      //set new name for next link 
      nodePrec = listDomain.get(i); 
      listaVertex.clear(); 
      finded = false; 
     } 

     g.shutdown(); 
    } 

} 

编辑1

在JavaScript中所做的同样的功能

  • 创建一个新的JS函数(名为例如 'AddNewDomain')
  • 添加一个名为“参数nameNewDomain “;

    var gdb = orient.getGraphNoTx(); 
    print("Insert new domain: '" + nameNewDomain + "'"); 
    
    // ---------------------check if path is already present 
    var listDomain = nameNewDomain.split('.'); 
    listDomain.reverse(); 
    
    var listaVertex; 
    var queryFirst = "select expand(in('Subdomain_of')) from Zone where name = "; 
    var name = ""; 
    var finded = false; 
    var nodePrec = "."; 
    
    for (i = 0; i < listDomain.length; i++) { 
        // from "." 
        listaVertex = gdb.command("sql", queryFirst + "'" + nodePrec + "'"); 
    
        for (ind = 0; ind < listaVertex.length; ind++) { 
         name = listaVertex[ind].getProperty("name"); 
    
         if (name.equals(listDomain[i])) { 
          finded = true; 
          break; 
         } 
        } 
        // if not finded 
        if (!finded) { 
         // add vertex 
         gdb.command("sql", "insert into Zone (name) values('" + listDomain[i] + "')"); 
    
         // add edge 
         gdb.command("sql", "create edge Subdomain_of from (select from Zone where name = '" + listDomain[i] 
           + "') to (select from Zone where name = '" + nodePrec + "')"); 
        } 
    
        // set new name for next link 
        nodePrec = listDomain[i]; 
        listaVertex = ""; 
        finded = false; 
    } 
    

在该选项卡中的工作室 '浏览',召回功能:

选择AddDomain( “mail3.example2.com”)

+0

谢谢!这似乎正是需要的。有没有一种方法可以使用JavaScript来完成相同的工作,以便我可以将它作为OrientDB中的函数存储? – Charles

+1

好的,我正在尝试使用javascript。只要我完成,我会通过你的功能 – lsavio

+1

对不起延迟,我编辑回答与“编辑1”,其中包含JS功能添加新的域遵循previus Java代码中的相同的逻辑写入。 – lsavio