2014-02-15 5 views
1

Вот простая социальная карта. Я ищу друзей друзей узла «А».Восстановить друзей друзей узла A

CREATE (pa:Person { name: "A", from: "Sweden", learn: "surfing" }), 
(pb:Person { name: "B", from: "London", title: "author" }), 
(pc:Person { name: "C", from: "Paris" }), 
(pd:Person { name: "D", from: "Pune" }), 
(pe:Person { name: "E", from: "Bangalore" }), 
(pf:Person { name: "F", from: "Chicago" }), 
(pg:Person { name: "G", from: "Sudney" }), 
(pa)-[:KNOWS {since: 2001}]->(pb), 
(pa)-[:KNOWS {rating: 5}]->(pc), 
(pa)-[:KNOWS]->(pd), 
(pb)-[:KNOWS]->(pd), 
(pb)-[:KNOWS]->(pe), 
(pb)-[:KNOWS]->(pf), 
(pc)-[:KNOWS]->(pd), 
(pd)-[:KNOWS]->(pa), 
(pd)-[:KNOWS]->(pg) 

Я выполнил следующий запрос.

MATCH (m:Person)-[:KNOWS]->(n:Person)-[:KNOWS]->(o:Person) 
WHERE m.name="A" 
return o; 

возвращает A, D, E, F, G

Я ожидал увидеть только E, F, G узлы.

Не могли бы вы помочь, что здесь не верно?

+0

между А и D узел существует связь двунаправленная. – user1132809

ответ

1

Он возвращает А, поскольку А - [: KNOWS] -> D - [: KNOWS] -> A
Он возвращает D, поскольку А - [: KNOWS] -> Б - [: KNOWS] -> D

Необходимо указать, что m <> n <> o и m не должны знать o.

MATCH (m:Person)-[:KNOWS]->(n:Person)-[:KNOWS]->(o:Person) 
WHERE m.name="A" AND m<>o AND NOT (m)-[:KNOWS]->(o) 
RETURN DISTINCT o; 

Смотрите это: http://console.neo4j.org/r/8i2vvu

+0

aha .. получил. Есть ли способ отфильтровать D также? Поскольку А непосредственно знает D. – user1132809

+0

Вы верны. Я отредактировал решение. – CapK

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