2013-10-05 5 views
2

Я установил простой пример для себя, чтобы увидеть, как Neo4j обрабатывает запросы с узлами, которые имеют отношения с собой, и я не могу заставить Cypher дать мне все пути.Запрос Cypher не возвращает все ожидаемые пути

Вот мои данные:

CREATE (A {name:'A'}), (B {name:'B'}), (C {name:'C'}) 
CREATE 
    (A)-[:REL]->(A), 
    (A)-[:REL]->(B), 
    (A)-[:REL]->(C), 
    (B)-[:REL]->(A), 
    (B)-[:REL]->(B), 
    (B)-[:REL]->(C), 
    (C)-[:REL]->(A), 
    (C)-[:REL]->(B), 
    (C)-[:REL]->(C) 

И вот вопрос, что я делаю:

MATCH p = (x)-[:REL*1..3]->(y) 
WHERE x.name='A' AND y.name='B' AND LENGTH(p) = 3 
RETURN nodes(p) 

Мои ожидаемые результаты:

A, A, A, B 
A, A, B, B 
A, A, C, B 
A, B, A, B 
A, B, B, B 
A, B, C, B 
A, C, A, B 
A, C, B, B 
A, C, C, B 

Но что я получаю это:

[(3 {name:"A"}), (2 {name:"B"}), (1 {name:"C"}), (2 {name:"B"})] 
[(3 {name:"A"}), (1 {name:"C"}), (3 {name:"A"}), (2 {name:"B"})] 
[(3 {name:"A"}), (1 {name:"C"}), (2 {name:"B"}), (2 {name:"B"})] 
[(3 {name:"A"}), (1 {name:"C"}), (1 {name:"C"}), (2 {name:"B"})] 
[(3 {name:"A"}), (3 {name:"A"}), (2 {name:"B"}), (2 {name:"B"})] 
[(3 {name:"A"}), (3 {name:"A"}), (1 {name:"C"}), (2 {name:"B"})] 

Так пути я не получаю являются:

A, A, A, B 
A, B, B, B 
A, B, A, B 

Кто-нибудь есть понимание?

Здесь в консоли: http://console.neo4j.org/?id=4srv4h

Спасибо заранее.

ответ

1

Существует только одно звено от А до А, поэтому он может только переходить от А к А один раз. Вот почему вы не получаете A, A, A (или B, B, B) ...

Аналогично, вы потребляете отношения A -> B в первый раз, когда вы идете между ними, поэтому вы не можете get A, B, A, B.

Наконец, вы можете сделать :REL*3 и оставить length(p) = 3.

+0

О, это имеет смысл. Спасибо, Уэс. Знаете ли вы какие-либо трюки, чтобы получить результаты, которые я хочу? Я пытаюсь моделировать стохастический процесс, который может вводить предыдущие состояния (узлы), и поэтому желательно, чтобы мой запрос мог повторять отношения в своих обходах. Если нет, то, наверное, мне придется переосмыслить эту идею. :) –

+0

Знаете ли вы, как долго путь такой? Вы можете разбить его с помощью СО. Причина такого поведения заключается в том, чтобы предотвратить бесконечные пути с циклами. Rels можно пройти только один раз. –

+0

http://console.neo4j.org/r/sl0z99 –

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