Cypher Query - 有条件地返回关系

时间:2014-03-20 18:45:29

标签: cypher neo4j

我一直试图弄清楚如何执行特定查询已经有一段时间了,并且经过多次尝试无济于事。下面是一个说明问题的例子:

有两种类型的节点,userdocument。用户可以使用标记为collaborates_with的关系类型,并且可以与can_editcreated或与之无关的文档相关。

现在我想做的是执行一个查询,该查询将返回符合一组搜索条件的所有文档(比如说在上周创建),如果文档是由collaborator创建的特定用户,返回该关系。

要获取文档和每个文档的创建者,查询非常简单:

MATCH (doc:document)<-[rel:created]-(u1:user)
WHERE doc.createddate > TIMESTAMP_FOR_ONE_WEEK_AGO
RETURN doc, u1

其中TIMESTAMP_FOR_ONE_WEEK_AGO只是现在对应的unix时间戳减去7 * 24 * 60 * 60 * 1000。

当试图有条件地返回与当前用户的关系时,困难就来了。

我玩CASE语句和OPTIONAL MATCH,但似乎没有任何东西可以得到我正在寻找的东西。我尝试的一个例子:

MATCH (doc:document)<-[rel:created]-(u1:user)
WHERE doc.createddate > TIMESTAMP_FOR_ONE_WEEK_AGO
WITH doc, u1
MATCH u1-[rel:collaborates_with]-(me:user)
WHERE me.username = MY_USERNAME
RETURN doc, rel

但是,这只会返回由document之一创建的collaborator。相反,我希望它返回适合搜索的所有document s,并且仅返回关系(如果存在)。

有没有人能够执行这样的事情?

注意:This question类似,但不完全是我遇到的。

1 个答案:

答案 0 :(得分:2)

可选匹配应该这样做:

MATCH (doc:document)<-[rel:created]-(u1:user)
WHERE doc.createddate > TIMESTAMP_FOR_ONE_WEEK_AGO
WITH doc, u1 //find all docs that satisfy search conditions
OPTIONAL MATCH u1-[rel:collaborates_with]-(me:user) //optionally see if the creator collaborates with me
WHERE me.username = MY_USERNAME
RETURN doc, rel