1

好吧,我正在设计一个使用 PHP 和 Neo4J 的小型附属系统,以便让自己更多地了解 Neo4J 以及图形数据库的工作原理。我最初的附属系统是在 MySQL 中,仅将设计和存储迁移到 Neo4J 来提高性能是荒谬的。

但是,有些功能我可能做错了,我愿意在更有经验的开发人员的帮助下看看它会变得多好。例如,系统每个月都必须计算支付给每个会员的美元金额。这遵循一些规则,迫使我搜索整个用户网络。

例如,为了计算 Joe 的月薪,系统必须:

Find Node Joe
function Calculate:
  Calculate amount of people referred (all tiers)
  Calculate the number of referral tiers (all tiers)
  Calculate points
  Store information inside object properties
  • 层级:乔指的是玛丽,而玛丽又指的是鲍勃。玛丽是第 1 层,鲍勃是第 2 层,在乔之下。
  • 所有层级:根据 Joe、Mary 和 Bob 计算数量

因此,Calculate 函数看起来像一个递归函数。对于 Joe 推荐的 Foreach 用户,我必须对他和他的任何孩子运行计算功能,直到我回到 Joe 并得到我的数字。

这慢得要命。我考虑过使用 RabbitMQ 或 ZMQ 并为 Joe 计算的每个“子进程”创建一个队列。我还考虑过使用 pcntl 的分叉。我怎样才能使我的图形网络中的这个递归过程更好?穿过整棵树的最佳方式是什么?排队?进程分叉?

另一个例子:

Calculate(Joe)
  Joe referred Mary, Bob, Peter
  Calculate(Mary)
  Mary referred Sara, Megan
    Calculate(Sara)
    Calculate(Megan)
  Calculate(Bob)
  Bob referred Billy, Michael
    Calculate(Billy)
    Calculate(Michael)
  Calculate(Peter)
  Peter referred Charles, Max
    Calculate(Charles)
    Calculate(Max)

现在,将这个乘以一个有 500 个推荐人的人,他的每个推荐人都可以有更多的 500 人。它慢得要命,我每个月都必须在乔的仪表板上显示这个。:(

4

2 回答 2

2

使用 Neo4j 和 Cypher,您可以按照以下 Graph Gist 的方式做一些事情:http: //tinyurl.com/7vryzwz

基本上,Cypher ( http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html ) 查询是

START referrer=node(1)
MATCH path=referrer-[:referred*1..]->refferee
RETURN referrer,refferee, length(path) as generation
ORDER BY length(path) asc

这有帮助吗?

/彼得

于 2012-05-08T07:20:20.020 回答
0

这不是太难。

每当有新的会员注册(或达到他们被视为会员的级别)时,将“1”添加到会员的Affiliate计数中,该计数应从零开始。在这样做的同时,一直向上移动附属公司的链条。

Bob 带来了 Fred,Fred 带来了 Anne。

当 Anne 注册时,Fred 收到 +1,Bob 收到 +1(或者,如果您愿意,可以收到少于 +1,因为 Anne 是第 2 层)。

这是自下而上的方法,您的附属网络是一堆树(一片森林),所以效果更好。你从叶子到树枝再到树干。这也意味着您可以提供一个人加入成功的不断更新的统计数据。

于 2012-05-08T02:35:04.257 回答