使用cypher限制neo4j中匹配集合元素的数量

时间:2014-03-27 10:43:58

标签: neo4j cypher

我有大量的节点与更大的节点数量有关系。我希望能够 查询有限数量的起始节点,并返回相关节点,但相关节点也应限制数量。

这在neo4j 1.9中是否可行?

例如,创建这些节点并在名称上有一个自动索引:

CREATE p = (bar{company:'Bar1'})<-[:FREQUENTS]-(andres {name:'Andres'})-[:WORKS_AT]->(neo{company:'Neo1'}) 
WITH andres 
CREATE (restaurant{company:'Restaurant1'})<-[:FREQUENTS]-(andres)-[:WORKS_AT]-(lib{company:'Library'}) ;

CREATE p = (bar{company:'Bar2'})<-[:FREQUENTS]-(todd {name:'Todd'})-[:WORKS_AT]->(neo{company:'Neo2'}) 
WITH todd 
CREATE (restaurant{company:'Restaurant2'})<-[:FREQUENTS]-(todd)-[:WORKS_AT]-(lib{company:'Library2'}) ;

CREATE p = (bar{company:'Bar3'})<-[:FREQUENTS]-(hank {name:'Hank'})-[:WORKS_AT]->(neo{company:'Neo3'}) 
WITH hank 
CREATE (restaurant{company:'Restaurant3'})<-[:FREQUENTS]-(hank)-[:WORKS_AT]-(lib{company:'Library3'}) ;

我想要的是:

START p=node:node_auto_index('*:*') 
MATCH p-[:WORKS_AT]-> c, p-[:FREQUENTS]-> f 
RETURN p, collect(distinct c.company), collect(distinct f.company) LIMIT 2;

要返回2行并将集合限制为一行,但不使用集合上的函数,请尝试使用大型集合 数据集,它变得非常慢。所以有一些方法来限制比赛..

如果在neo4j 1.9中无法做到这一点,neo4j 2.0会有解决方案吗?

2 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情:

START p=node:node_auto_index('*:*') 
RETURN p, 
     head(extract(path in p-[:WORKS_AT]->() : head(tail(nodes(path))))) as work_company,
     head(extract(path in p-[:FREQUENTS]->() : head(tail(nodes(path))))) as visit_company

提取的路径节点上的head函数应该是惰性的,因此它只从模式匹配中拉出第一个

如果查看分析输出,您应该看到它只触及每个第一个节点。

答案 1 :(得分:0)

可能是查询在索引层中触发了一些非常大的操作,而不是懒惰。我会尝试这样的事情:

START p=node:node_auto_index('*:*') 
WITH p LIMIT 2
MATCH p-[:WORKS_AT]-> c, p-[:FREQUENTS]-> f return p, collect(distinct c.company), collect(distinct f.company)