Neo4j Cypher子查询公式如何使用With子句?

时间:2018-08-16 07:52:45

标签: neo4j subquery cypher

我试图创建一个简单的密文query,该密文应该找到图中与该结构(BlogPost A) -> (Term) <- (BlogPost B)大致匹配的所有实例。这意味着,我正在尝试对所有标记有相同术语的博客帖子,还要计算术语的数量。术语是这种情况下的分类机制。

这是我的查询建议:

MATCH (blogA:content {entitySubType:'blog'}) 
WITH blogA MATCH (blogA) -[]-> (t:term) <-[]- (blogB:content) 
WHERE blogB.entitySubType='blog' AND NOT (ID(blogA) = ID(blogB))  
RETURN ID(blogA), ID(blogB), count(t) ;

此查询在约1天后以null结尾。

在子查询中blogA的用法是否无法以我的使用方式进行?当使用具有限制的相同查询时,我会得到重用:

MATCH (blogA:content {entitySubType:'blog'}) 
WITH blogA 
LIMIT 10 
MATCH (blogA) -[]-> (t:term) <-[]- (blogB:content) 
WHERE blogB.entitySubType='blog' AND NOT (ID(blogA) = ID(blogB))  
RETURN ID(blogA), ID(blogB), count(t) 
LIMIT 20;

我的Neo4j实例具有约500GB RAM,包括所有属性的整个图为约30GB,总共约有1500万个顶点,而博客顶点数为101k,术语数为108k。

对于可能出现的问题或建议的改进表示感谢。

1 个答案:

答案 0 :(得分:0)

还要确保使用可以流式传输数十亿个结果的客户端驱动程序(例如Java)来使用该查询。这是一个使用编译后的运行时的查询,该运行时应该最快,内存效率最高。

MATCH (blogA:Blog)-[:TAGGED]->(t:Term)<-[:TAGGED]-(blogB:Blog)
WHERE blogA <> blogB 
RETURN ID(blogA), ID(blogB), count(t);