Neo4J Cypher:仅当行数小于阈值时才返回某些属性

Neo4J Cypher:仅当行数小于阈值时才返回某些属性,neo4j,cypher,Neo4j,Cypher,我有一个类似这样的密码查询: match (s)-[r]-(m) where s.id='...' and r.id='...' return s.id as id, s.title as title, s.content as content 我想要实现的是,仅当总行数小于给定阈值(例如5)时,才返回s.content的值(可能非常大) 我试过了 match (s:mytype)-[r:myothertype]-(m:mytype) where s.id='...' and

我有一个类似这样的密码查询:

match (s)-[r]-(m) 
  where s.id='...' and r.id='...' 
  return s.id as id, s.title as title, s.content as content
我想要实现的是,仅当总行数小于给定阈值(例如5)时,才返回s.content的值(可能非常大)

我试过了

match (s:mytype)-[r:myothertype]-(m:mytype) 
  where s.id='...' and r.id='...' 
  return s.id as id, s.title as title, 
  case
    when count(*) < 5 s.content
    else null 
  end as content
匹配(s:mytype)-[r:myothertype]-(m:mytype)
其中s.id='..'和r.id='..'
返回s.id作为id,s.title作为标题,
案例
当计数(*)小于5秒时
否则无效
以内容结尾
这个查询在语法上似乎是正确的,但它需要花费很长时间才能返回并最终破坏我的服务器,即使数据库中只有10个节点和4个关系

我做错了什么

Thanx提前

延斯


顺便说一句:我不想限制结果。在任何情况下,我都需要所有节点的id和标题。

有一些因素可能会导致性能问题,但这在很大程度上取决于您的数据。您已经在示例中进行了概括,但假设您没有为
x.id
的属性设置索引

运行以下查询,在属性
id
的标签
mytype
上设置索引:

CREATE INDEX ON :mytype(id)
然后请尝试此优化查询。问题可能是,对于每个
s
节点,您正在对整个集合的计数执行聚合。这在计算上似乎很昂贵

MATCH (s:mytype { id: '...' })
MATCH (s)-[r:myothertype { id: '...'}]-(:mytype)
WITH count(*) as content_weight
MATCH (s:mytype { id: '...' })
MATCH (s)-[r:myothertype { id: '...'}]-(:mytype)
WITH s, content_weight,
     (CASE
        WHEN content_weight < 5 THEN s.content
        ELSE null 
      END) as content
RETURN s.id, s.title, content
MATCH(s:mytype{id:''…'})
匹配-[r:myothertype{id:'.'}]-(:mytype)
以计数(*)作为内容重量
匹配(s:mytype{id:'.''.'})
匹配-[r:myothertype{id:'.'}]-(:mytype)
使用s,内容和重量,
(案例
当含量/重量<5时,则为s含量
否则无效
结束)作为内容
返回序列号、序列号标题、内容

更新:你会看到两场比赛在这里进行。还有另一种方法可以使用Cypher中即将推出的功能进行此查询。目前,该查询的性能应该很好。正确的方法是在
s
上采集,获取采集长度,然后将采集放回具有内容权重的行。很抱歉给您带来不便。

我的neoj4实例中有100万条记录,每当我在一个相当大的数据集上尝试co do
count()
时,它就会失败。除非您完全确定您的系统能够处理此问题,否则我不建议您坚持使用此习惯用法。在Neo4j 2.0 GA中使用Cypher在大型数据集上运行
count()
没有问题。如果您遇到问题,请在这里就Stackoverflow提出问题,或者如果您是Neo4j客户,请出示支持票。我告诉您,有一个问题。当我通过web界面运行
start n=node(*)return count(*)
时,服务器完全挂断。我并不是唯一一个经历过这种情况的人。对不起,这对我来说不起作用。我已经在id上设置了一个索引,并尝试使用
this
来分隔查询的各个部分,但这总是导致
content\u weight
为1。它似乎并不取决于返回的行数。当我返回
count(s)
而不返回
this
时,返回的行数存储在那里。。。我不能说我理解到目前为止这是怎么回事。至少你的查询没有破坏我的服务器,并且在几毫秒内返回。非常感谢你。您甚至可以使用省去第一个
后的第一个
匹配
。顺便问一下:从性能角度来看,这是一种明智的处理方法,还是触发两个查询(如果第一个查询的结果足够小)更好。