我有大量的节点与更大的节点数量有关系。我希望能够 查询有限数量的起始节点,并返回相关节点,但相关节点也应限制数量。
这在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会有解决方案吗?
答案 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)