Общий обход ориентированного дерева с Neo4J - PullRequest
4 голосов
/ 07 октября 2011

Я смоделировал направленную древовидную структуру, используя базу данных графов Neo4J.Итак, у меня есть что-то вроде этого: http://ouwarovite.net/YAPC/220px-Binary_tree.svg.png (не обязательно двоичный файл)

Пользователи моей базы данных могут добавлять дочерние узлы существующих узлов по желанию, поэтому высота дерева и степень одиночногоузлы неизвестны.

Теперь я хочу сделать запрос к моему дереву следующим образом: начиная с узла x, дать мне все листья, которые являются потомками отпуска x.

Может ли этот тип запроса выполняться сGremlin или Cypher, и если да, то как это сделать, добившись максимальной производительности?(Я не нашел возможности выполнять запросы на «общих» деревьях, потому что вы всегда должны указывать максимальную глубину)

Я знаю, что это возможно с помощью инфраструктуры REST / JSON и JAVA API, как это:

POST /db/data/node/51/traverse/node 
{ 
"return_filter" : 
    {
    "body" : "position.endNode().hasProperty('leave')" ,
    "language" : "javascript" 
     }, 
"relationships" : [ { "type" : "_default", "direction" : "out" } ] , 
"prune_evaluator" : { "name" : "none" , "language" : "builtin" }
}

(у моих листьев есть свойство 'уйти', у моих ребер нет типа -> так _default)

Есть ли более простой / лучший способ сделать это, возможно, с лучшимпроизводительность

1 Ответ

4 голосов
/ 07 ноября 2011

Cypher может выглядеть так:

start root=node({rootId}) 
match root-[*]->child
where child.leave
return child

rootId является параметром, который должен быть передан.

...