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

使用cypher限制neo4j中匹配集合元素的数量,neo4j,cypher,Neo4j,Cypher,我有大量的节点,它们与更多的节点具有传出关系。我希望能够 查询有限数量的起始节点,返回相关节点,但相关节点的数量也应有限 在neo4j 1.9中是否可能实现这一点 例如,创建这些节点并对名称进行自动索引: CREATE p = (bar{company:'Bar1'})<-[:FREQUENTS]-(andres {name:'Andres'})-[:WORKS_AT]->(neo{company:'Neo1'}) WITH andres CREATE (restaurant{c

我有大量的节点,它们与更多的节点具有传出关系。我希望能够 查询有限数量的起始节点,返回相关节点,但相关节点的数量也应有限

在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'}) ;
要返回两行并将集合限制为一行,但不在集合上使用函数,请在大型数据库上尝试此操作 数据集,它变得非常缓慢。所以要想办法限制比赛

如果这在neo4j 1.9中不可能,neo4j 2.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)
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

你能试试这样的东西吗

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)
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函数应该是惰性的,因此它只从模式匹配中提取第一个


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

这并没有对相关节点进行限制。而且您不想在集合上使用函数,如
HEAD(COLLECT(c))
等。否,因为在现实世界中,我们有大量的相关物品让我们无法使用performance@wouter啊,你说得对,这在语义上是不同的。你能在原始查询上运行一个概要文件,并查看_db_hits字段,看看它是否以某种方式通过大量记录?您可以在Neo4j shell中使用“PROFILE START p=…”运行它。@请注意,当h返回h.company和
返回head(collect(c.company))
时,head(collect(c.company))
与head(collect(c.company))
之间的区别,即前者收集节点(更便宜)并点击属性存储一次,后者收集属性,这更昂贵。差异应该是显著的,尽管对于您的数据集来说可能还不够显著。是的,这很有效。我不明白的一件事是为什么尾部是必要的,另一个问题是:如何从相关集合中得到多个结果?