Neo4j连接并交叉两个可选查询

时间:2015-07-30 20:34:35

标签: graph neo4j cypher

我有与类别和用户关系的流,但这些关系是可选关系。因此,流不应始终与类别或用户相关,它可能仅与某个类别或多个类别或用户相关。我的问题是我想加入两个可选的查询来处理所有这些情况。下面的例子,行为如下,如果节点存在类别和用户关系,它就有效,但如果节点在例子中只有一个用户关系,则它不起作用。任何想法?

MATCH (stream:Stream {id: "xyz123"})
MATCH (stream)-[:CONTAINS]->(categories)-[:CHILD_OF*0..50]->(subcats)<-[:PHOTO_OF]-(photo), (stream)<-[:PARTICIPANT_OF]-(users)<-[:OWNER]-(photo)
WHERE photo.is_private=false
return collect(photo.id) as photo_ids

如果用户和类别关系都存在,我需要的是两个匹配的交集。如果只存在类别或用户关系,则只带来该关系的结果

1 个答案:

答案 0 :(得分:2)

这对你有用吗?

MATCH (stream:Stream { id: "xyz123" })
OPTIONAL MATCH (stream)-[:CONTAINS]->(categories)-[:CHILD_OF*0..50]->(subcats)<-[:PHOTO_OF]-(photo)
WHERE photo.is_private=false
WITH stream, COLLECT(photo) AS p1
OPTIONAL MATCH (stream)<-[:PARTICIPANT_OF]-(users)<-[:OWNER]-(photo)
WHERE photo.is_private=false
WITH stream, p1 + COLLECT(photo) AS pCombined
UNWIND pCombined AS photo
RETURN COLLECT(DISTINCT photo.id) AS photo_ids

Here is a console显示此查询有效。