2012-01-31 18 views
6

Po prostu zaczynam od neo4j i rozumiem zasady wykresu i relacji, ale mam pewne problemy z niektórymi strukturami, które chcę modelować. Chciałem go użyć w projekcie języka programowania i przechowywać AST przeanalizowanego pliku źródłowego. Stamtąd planuję dodać wiele dodatkowych danych i relacji do węzłów, aby pomóc w analizie i narzędziach, ale podstawowa AST jest wciąż trochę trudna.Modelowanie uporządkowanego drzewa za pomocą neo4j

Naiwnym sposobem tworzenia drzewa byłoby po prostu chodzenie po AST i kopiowanie każdego węzła drzewa do węzła w neo4j, używanie właściwości do śledzenia danych o tokenach itp., A następnie używanie relacji DZIECKO do punktu do węzłów potomnych. Problem polega na tym, że kiedy później chcę przejść przez drzewo, muszę być w stanie zrobić to we właściwej kolejności oryginalnej AST, ale po wyjęciu z pudełka nie jestem do końca pewien, jak najlepiej to zrobić.

Mam dwa podstawowe podejścia, które myślę sobie z głowy. Jednym z nich jest dodanie właściwości index/ordinal do każdej relacji CHILD. Drugi ma mieć PIERWSZY związek z pierwszym dzieckiem i NASTĘPNY związek między każdym dzieckiem, aby utrzymać porządek w ten sposób.

Dla każdego z tych podejść nadal nie wygląda na to, że jest coś nieoczekiwanego, dzięki czemu mogę przemierzyć to we właściwej kolejności. Myślę, że jeśli wykonam PIERWSZĄ/NASTĘPNĄ, mogę uzyskać poprawną kolejność, o ile zmuszę neo4j do ciągłego przemierzania PIERWSZEGO pierwszego i wykonania pierwszego wyszukiwania w głębi. Czy to działa? Czy istnieje lepszy sposób? To wydaje się być czymś, co powinno być łatwiejsze w obsłudze po wyjęciu z pudełka.

UPDATE

Ostatecznie postanowiłem wykorzystać zarówno z moich pomysłów. Węzły potomne mają relację CHILD z właściwością indeksu. Pierwsze dziecko ma również związek FIRST_CHILD. Węzły rodzeństwa mają relację NEXT_SIBLING, aby podać prawidłową kolejność. Po tym, przechodzenie było łatwe:

//reusable traversal description 
final private TraversalDescription AST_TRAVERSAL = Traversal.description() 
    .depthFirst() 
    .expand(new OrderedByTypeExpander() 
     .add(RelType.FIRST_CHILD, Direction.OUTGOING) 
     .add(RelType.NEXT_SIBLING, Direction.OUTGOING)); 

i wtedy, kiedy rzeczywiście potrzebne chodzić drzewo może po prostu zrobić

for(Path path : AST_TRAVERSAL.traverse(astRoot)){ 
    //do stuff here 
} 

Dla mojego przypadku użycia, ja właściwie nie modyfikować strukturę drzewa samo po utworzeniu - po prostu wykonuję analizy i dodaje więcej relacji i właściwości, więc jest to łatwe do utrzymania. Gdybym musiał zrobić więcej modyfikacji, może to być trochę pracy, szczególnie jeśli chcę utrzymać numery indeksów na relacjach między dziećmi. To może być coś do rozważenia dla kogoś innego w podobnej sytuacji.

Gdybym dostał coś bardziej zmiennego, prawdopodobnie wypróbowałbym kolekcje, które zasugerował Peter Neubauer, i prawdopodobnie utworzyłby klasę OrderedTreeNode wskazującą na węzeł i korzystającą z kolekcji List dla dzieci.

Odpowiedz

1

Russel, pracujemy nad takimi rzeczami, mamy uporządkowane drzewo czasu w pracach, które jest zorganizowane według różnych ROK-2012-> MIESIĄC-01-> DZIEŃ-21-> WARTOŚĆ123 i będą prawdopodobnie mają NEXT związki między np MIESIĄCE tego samego roku.

W przeciwnym razie, jeśli to zrobisz, rozważ wniesienie wkładu lub zbadanie sprawy w https://github.com/neo4j/graph-collections, wkład i testy są wysoko cenione!

+0

dzięki, szukam i myślę, że w pewnym momencie mógłbym użyć niektórych z tych rzeczy. Na razie, ponieważ nie robię wielu modyfikacji węzłów po utworzeniu, myślę, że pozostanę przy PIERWSZEJ/NAJBLIŻSZEJ, ale jeśli będę miał bardziej skomplikowane wymagania, zdecydowanie będę musiał spróbować . Pomocna byłaby trochę dodatkowa dokumentacja, ale rozumiem, że jest to praca w toku i jak dotąd wygląda świetnie, dzięki. –

1

Z korzyścią dla każdego, znalezienie tego więcej niż 2 lata później, w końcu to biblioteka, która obsługuje drzew czasu po wyjęciu z pudełka (Zastrzeżenie: Jestem jednym z autorów):

https://github.com/graphaware/neo4j-timetree

+0

Czy to działa z Spring Data Neo4j? – John

Powiązane problemy