2017-01-05 3 views
1

Скажем, у меня есть вопрос, как:Orientdb: получить все пройденные элементы пути

select out("E1").out("E2").out("E3") from V1 

где E1, E2, E3 классы простирающиеся «E» и V1 является классом расширения «V».

Я хотел бы получить все элементы, которые были пройдены при выполнении запроса (т. Е. Не только конечные результаты). Рассмотрите это как своего рода отслеживание элементов, которые были задействованы при выполнении запроса.

Я попробовал следующую команду: траверс

traverse in from (traverse outE("E3") from (traverse in from (traverse outE("E2") from (traverse in from (traverse outE("E1") from V1))))) 

, которая близка к тому, что мне нужно, но это не то же самое. Проблема с этой командой заключается в том, что если некоторые вершины исходного набора «V1» содержат ребра класса «E2» или «E3», то они также пройдут, хотя я не хочу, чтобы они проходили (начиная с запрос select будет пересекать края «E2» вершин, которые были возвращены только путем пересечения границ «E1»). То есть, я хотел бы, чтобы команда TRAVERSE проходила только результаты предыдущего шага, а не все результаты до этого момента

Есть ли способ достичь этого?

ответ

1

Вы должны использовать MATCH вместо:

MATCH 
{class:V1, as:a} -E1-> {as:b} -E2-> {as:c} -E3-> {as:d} 
RETURN $patterns 

Это вернет все RID, которые соответствуют шаблону, например.

| a | b | c | d | 
| #12:0 | #12:1 | #12:2 | #12:4 | 
| #12:3 | #12:5 | #12:7 | #12:8 | 

Если вам нужно их расширить, просто заменить return $patterns с return $elements, например.

MATCH 
{class:V1, as:a} -E1-> {as:b} -E2-> {as:c} -E3-> {as:d} 
RETURN $elements 
+0

полный синтаксис здесь http://orientdb.com/docs/2.2.x/SQL-Match.html –

+0

Благодаря Луиджи. Это то, что я искал. Мне просто нужно было отрегулировать ваш ответ, чтобы включить ребра между вершинами следующим образом: 'MATCH {class: V1, as: a} .outE (" E1 ") {as: b} .inV() {as : c} .outE ("E2") {as: d} .inV() {as: e} .outE ("E3") {as: f} .inV() {as: g} RETURN $ patterns' –

Смежные вопросы