2016-03-20 29 views
1

Bir DNS hiyerarşisini bir OrientDB grafiğinde saklama fikrini deniyorum ve belirli bir etki alanı için yeni bir köşe noktası eklemek için uygun yeri bulmakta sorun yaşıyorum.OrientDB'de bilinen bir yolu arama

bu yapıyla başlıyorum:

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

Ben girdi olarak bir alan adı dize almak ve grafiğin ilgili alt alanları katacak kaydedilmiş bir işlev oluşturmak istiyorum.

"mail.example.com" alanını eklemek istiyorum. Fonksiyonun ilk önce yolun .com.example.mail var olup olmadığını araştırması gerekir - eğer değilse, daha sonra .com.example dosyasını kontrol etmeli ve "example" vertex'inin bir subdomain edge ile "mail" için yeni bir vertex eklemesi gerekir. .

Belirli bir yola göre yaprak düğümü aramanın bir yolu var mı? Neo4j/Cypher'ın sözdizimine benzer bir şey:

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

sayesinde, zaten mevcut değilse yeni köşeleri eklemek gerekir bu Java fonksiyonu ile

Charles

+0

için Java veya Javascript'te daha kullanışlı mısın? 'Yaprak düğümü aramak için ne demek istediğini anlamadım, örneğin "www" denilen bir' köşe yaprak 'olup olmadığını araştırmak ister misiniz? – lsavio

cevap

1

. JAVASCRIPT yapılan

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

} 

DÜZENLEME 1

aynı işlevi

  • yeni JS fonksiyonunu (örneğin adı 'AddNewDomain') oluştur
  • 'adlı parametreyi ekleyin nameNewDomain '; stüdyoda Tab 'göz attığınız' in

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; 
} 
, işlevini çağırmak:

seçme AddDomain ("mail3.example2.com") işlevi hakkında

+0

Teşekkürler! Bu tam olarak ihtiyaç duyulana benziyor. Aynı işi yapmak için JavaScript'i kullanabileceğim bir yol var mı, böylece OrientDB'de bir işlev olarak saklayabilirim? – Charles

+1

tamam, javascript'te yapmaya çalışıyorum. Ben bitirir bitirmez, size gecikme için – lsavio

+1

işlevini ileteceğim, previus java kodunda aynı mantık writtend'i takip eden yeni etki alanı eklemek için JS işlevini içeren "EDIT 1" ile cevap düzenledim. – lsavio

İlgili konular