好吧,我正在设计一个使用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
因此,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多人。这很慢,我必须每个月在Joe的仪表板上展示这个。 :(
答案 0 :(得分:2)
使用Neo4j和Cypher,您可以按照图表要点执行某些操作: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
这有帮助吗?
/彼得
答案 1 :(得分:0)
这不太难。
每当新会员注册(或达到他们被视为会员的级别)时,将“1”添加到会员的Affiliate
计数,该计数应从零开始。在这样做的同时,一直向上移动到附属机构链......
当Anne注册时,Fred收到+1,而Bob收到+1(或者,如果你愿意,可以收到少于+1,因为Anne是2级)。
这是自下而上的方法,你的联盟网络是一堆树(森林),所以它更好地工作。你从树叶到树枝到树干。这也意味着您可以提供不断更新的人员归属成功统计数据。