2015-08-10 2 views
1

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

optional match(document:Document{id:6})-[:SHARED]-()-[:IN_DEPARTMENT_WITH]-(me:Person{Email:'user[email protected]'}) 
optional match(document2:Document{id:6})-[:SHARED]-(me2:Person{Email:'[email protected]'}) 
return document,me,document2,me2 

Как я должен вернуть документ или документ2, и меня или меня2, в зависимости от того, какой матч попадает в хит, он делает вещи немного грязными, есть ли способ сделать его более чистым, так что когда-либо совпадение получает удар, я возвращаю документ и меня?

Благодаря

ответ

1

В этом случае я хотел бы использовать путь нулевой длины в качестве своего рода прокси на дополнительный матч. Рассмотрим этот пример набора данных:

CREATE (doc1:Document {id:1}), 
     (doc2:Document {id:2}), 
     (doc3:Document {id:3}), 

     (you:Person {Email:"[email protected]"}), 
     (colleague:Person {Email:"[email protected]"}), 
     (nonColleague:Person {Email:"[email protected]"}), 

     (you)-[:IN_DEPARTMENT_WITH]->(colleague), 
     (you)-[:SHARED]->(doc1), 
     (colleague)-[:SHARED]->(doc2), 
     (nonColleague)-[:SHARED]->(doc3); 

В случае документа 1, вы делили его, поэтому мы хотим, чтобы это было возвращено с вами в качестве дольщика. В случае с документом 2 ваш коллега поделился им, поэтому мы хотим, чтобы он был возвращен вместе с вашим коллегой в качестве участника. В случае с документом 3 мы не хотим никаких результатов, поскольку ни вы, ни ваш коллега не поделились этим документом.

Мы можем написать один запрос, который охватывает все три сценария, используя путь нулевой длины при сопоставлении отношений [:IN_DEPARTMENT_WITH].

Документ 1:

MATCH (colleague:Person)-[:SHARED]->(doc:Document { id:1 }), 
     (:Person { Email:"[email protected]" })-[:IN_DEPARTMENT_WITH*0..1]-(colleague) 
RETURN colleague.Email, doc.id; 

colleague.Email  doc.id 
[email protected] 1 

Документ 2:

MATCH (colleague:Person)-[:SHARED]->(doc:Document { id:2 }), 
     (:Person { Email:"[email protected]" })-[:IN_DEPARTMENT_WITH*0..1]-(colleague) 
RETURN colleague.Email, doc.id; 

colleague.Email  doc.id 
[email protected] 2 

Документ 3:

MATCH (colleague:Person)-[:SHARED]->(doc:Document { id:3 }), 
     (:Person { Email:"[email protected]" })-[:IN_DEPARTMENT_WITH*0..1]-(colleague) 
RETURN colleague.Email, doc.id; 

No rows. 

Обратите внимание, что вы иногда "коллега"; в случае, если вы поделились документом, вы сопоставлены с номером colleague с пулом длины. Вы можете играть с ним здесь: http://console.neo4j.org/r/yhyrqu

+0

это замечательный, спасибо. Протестировано и работает. –

0

Это работает для вас?

MATCH (me:Person{Email:'[email protected]'}), (doc:Document{id:6}) 
OPTIONAL MATCH (doc)-[r:SHARED]-(me) 
WITH me, doc, (CASE WHEN r IS NULL THEN [] ELSE [me] END) AS myself 
OPTIONAL MATCH (doc)-[:SHARED]-(p)-[:IN_DEPARTMENT_WITH]-(me) 
RETURN doc, COLLECT(p) + myself AS result; 

Этот запрос соответствует me и doc только один раз, и объединяет два (возможно, пустые) коллекции, чтобы прибыть в результате сбора людей. Результат не будет содержать строк, если MATCH (в первой строке) не находит совпадений.

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