【问题标题】:Neo4j join and intersect two optional queriesNeo4j 连接和交叉两个可选查询
【发布时间】:2015-07-30 20:34:35
【问题描述】:

我有与类别和用户有关系的流,但这些关系是可选关系。所以流不应该总是与一个类别或用户相关,它可能只与一个类别或多个类别或用户相关。我的问题是我想加入两个处理所有这些情况的可选查询。下面的示例,行为如下,如果节点的类别和用户关系都存在,则它可以工作,但如果节点在示例中只有一个用户关系,则它不起作用。有什么想法吗?

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

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

【问题讨论】:

  • 您的第一个 MATCH 子句格式不正确。请修复。

标签: graph neo4j cypher


【解决方案1】:

这对你有用吗?

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 表明此查询有效。

【讨论】:

  • 不幸的是,现在在所有情况下都返回空
  • 我已在我的答案中添加了一个指向控制台的链接,该链接显示此查询有效。请查看并指出与您的情况有任何显着差异。
  • 谢谢,这可行,但我需要的是查询的交集,现在它可以工作,但如果存在类别关系,它还会带来不属于流类别的照片,如果有用户关系,它会带来所有照片的用户与类别无关。如果两者都存在,我需要的是类别和用户的交集
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多