首页 > 解决方案 > 编写一个查询返回neo4j中两个节点之间的补充关系

问题描述

我有一个具有这种形式的 neo4j 数据库

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

一个 Post可以有两个或多个与之连接的(:Node)节点。(:Friend)

我想写一个返回这个模式的查询

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

我在哪里(:Post)需要那个特定的所有帖子(n:Friend)。问题是并非所有节点都(:Post)与另一个节点连接,(m:Friend)因此仅适用于我拥有的某些节点 (n:Friend)<-[:Tagged_together]->(m:Friend)

我编写了这段代码,但显然只返回(:Post)特定节点的所有节点以及与之连接的(: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

我该如何解决这个问题?

标签: neo4jcypher

解决方案


尝试可选匹配。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

推荐阅读