2016-03-20 3 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 /サイファー構文に似て何か:

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

おかげで、まだ存在しない場合は、新しい頂点を追加する必要があり、このJava機能付き

チャールズ

+0

、用をあなたはJavaやJavascriptでもっと便利に開発されていますか? 「リーフノードを検索する」という意味を理解できませんでした。たとえば、「www」という「頂点リーフ」があるかどうか検索したいのですか? – lsavio

答えて

1

。 JavaScriptで作られた

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(); 
    } 

} 

EDIT 1

同じ機能

  • 新しい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

遅れて申し訳ありません、私は新しいドメインを追加するJS関数が含まれている "EDIT 1"で答えを編集previus Javaコードで同じロジックwrittendに従ってください。 – lsavio

関連する問題