2014-11-03 55 views
0

如何获取用户的新闻源?Neo4j,Cypher:获取新闻源(Graphiti)

撷取与ID用户新闻馈送= 4084079

MATCH (u:User) 
WHERE ID(u)=4084079 
OPTIONAL MATCH p=(u)-[r:Ego*..]->(friend:User) 
WHERE all(r2 in relationships(p) 
    WHERE r2.user_id=4084079) 
WITH friend MATCH (friend)-[:FeedNext*]->(feed) 
RETURN labels(feed), feed, feed.timestamp 
ORDER BY toInt(feed.timestamp) DESC 
SKIP 1 
LIMIT 10 

此行尝试匹配其变成无穷大,且因此该查询挂起的最长路径。 WHEREOPTIONAL MATCH子句分开执行。

OPTIONAL MATCH p=(u)-[r:Ego*..]->(friend:User) 

如何避免r被匹配所有user_id

以这种方式编写查询会返回语法错误。

OPTIONAL MATCH p=(u)-[r:Ego{user_id:4084079}*..]->(friend:User) 

回答

0

这应该工作:

OPTIONAL MATCH p=(u)-[r:Ego*.. {user_id:4084079}]->(friend:User) 

您也可以不指定..

OPTIONAL MATCH p=(u)-[r:Ego* {user_id:4084079}]->(friend:User) 

但我可能会限制它的最大路径长度。

此外,Cypher可能还不是最快的解决方案,它将随着新的查询计划器(尝试用cypher 2.1.experimental作为测试的前缀)来更改。

否则你可能想看看服务器扩展像这样的:

https://github.com/jexp/neo4j-activity-stream