我一直试图弄清楚如何执行特定查询已经有一段时间了,并且经过多次尝试无济于事。下面是一个说明问题的例子:
有两种类型的节点,user
和document
。用户可以使用标记为collaborates_with
的关系类型,并且可以与can_edit
,created
或与之无关的文档相关。
现在我想做的是执行一个查询,该查询将返回符合一组搜索条件的所有文档(比如说在上周创建),如果文档是由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类似,但不完全是我遇到的。
答案 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