написать запрос, который возвращает дополнительные отношения между двумя узлами в neo4j - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть neo4j db, который имеет эту форму

(:FBuser)-[:Published]->(:Post)<-[:Tagged_in]-(:Friend)<-[:Tagged_together]->(:Friend)

Сообщение (:Node) может иметь два или более узлов (:Friend), связанных с ним.

Я хочу написать запрос, который возвращает эту схему

(:FBuser)-[:Friend]->(n:Friend)-[:Tagged_in]->(:Post)<-[:Tagged_in]-(m:Friend)<-[:Tagged_together]->(n)

, где для (:Post) мне нужны все сообщения для этой спецификации c (n:Friend). Проблема в том, что не все (:Post) связаны с другим (m:Friend), поэтому только для некоторых узлов у меня есть (n:Friend)<-[:Tagged_together]->(m:Friend)

Я пишу этот код, но, очевидно, возвращает только все узлы (:Post) для конкретный c узел (:Friend) и связанный с ним дополнительный (:Friend)

MATCH t=(:fbUser)-[:FRIEND]-(w)-[:TAGGED_IN]-(p)
MATCH s=(:Friend)-[:TAGGED_IN]-(q)
WHERE  
     w.name=~ '(?i).*edoardo.*' AND
     q.timestamp=p.timestamp AND
     w.nodeDegree>=0 
RETURN t,s

Как решить проблему?

1 Ответ

0 голосов
/ 10 февраля 2020

Попробуйте опциональное совпадение. https://neo4j.com/docs/cypher-manual/current/clauses/optional-match/

Я использовал оператор объединения, чтобы фильтр меток времени по-прежнему возвращал записи, если q равно нулю.

MATCH t=(:fbUser)-[:FRIEND]-(w)-[:TAGGED_IN]-(p)
OPTIONAL MATCH s=(:Friend)-[:TAGGED_IN]-(q)
WHERE  
     w.name=~ '(?i).*edoardo.*' AND
     coalesce(q.timestamp, p.timestamp)=p.timestamp AND
     w.nodeDegree>=0 
RETURN t,s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...