【问题标题】:Is there anything like a "do while" match pattern that satisfy an aggregated value ? (propeties etc)是否有任何满足聚合值的“do while”匹配模式? (属性等)
【发布时间】:2014-03-25 21:09:49
【问题描述】:

我不知道使用 Cypher 或图遍历是否有意义,但我试图做一种“最短路径”查询,但不是基于加权关系,而是基于聚合属性。

假设我有标记为“人员”的节点,并且它们都访问了与主页节点具有 VISIT 关系的不同主页。每个主页节点都有根据其受欢迎程度的点击统计信息。现在我想将具有访问关系的人与主页匹配,直到我达到最大 X 次曝光(点击)。

为什么?因为那时我知道针对特定人群的“预期”曝光策略。

类似

Do 
MATCH (n:People)-[:VISITS]-(sites)
while (reduce (x)<100000)

当然,这个“Do while”不是我在 Cypher 语法中见过的,但它不是很有用吗?或者这应该是在应用程序级别,只需返回一个 DESC 列表并在应用程序中进行数学运算。如果不能满足循环,它也应该与某些情况相匹配。

MATCH (n:People)-[:VISITS]-sites
WITH reduce(hits=0, x IN collect(sites.dailyhits)| hits + x) AS totalhits
RETURN totalhits;

可以返回正确的聚合命中值(全部),但我希望这个函数运行每个匹配的模式,直到它满足一个值并返回匹配(当然我错过了其他可能的并且在页面之间混合因为匹配从不遍历整个图表..但至少我有一个列表中符合要求的页面的答案,如果它有意义的话)?

谢谢!

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    不确定如何聚合,但有几个聚合函数(avg、sum 等)。而且...您可以使用WITH 子句将这些传递到密码查询的第二部分。

    也就是说:Cypher 还支持对结果进行排序的功能 (ORDER BY),以及限制给定结果数量的功能 (LIMIT)。我不知道你会按什么排序,但是......只是为了好玩,让我们随意排序:

    MATCH (n:People)-[v:VISITS]->(site:Site)
    WHERE site.url= "http://somename.com"
    RETURN n
    ORDER BY v.VisitCount DESC
    LIMIT 1000
    

    对于访问给定网站的人,这会将您的返回设置限制为 1,000 人。

    【讨论】:

    • 谢谢大卫,一切似乎都是有效的,感谢你的例子。但是,我希望 Cypher 回答的是:给我一个访问网站的用户的路径策略(列表)(第一个匹配表达式),以便根据聚合的 dailyhits 节点属性每天达到 1000 次。
    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多