【问题标题】:how to design my dataset using neo4j and gremlin如何使用 neo4j 和 gremlin 设计我的数据集
【发布时间】:2013-09-07 14:33:31
【问题描述】:

我有一个包含如下字段的数据集:

id  amount date        s_pName   s_cName      b_pName   b_cName

 1    100   2/3/2012      IBM    IBM_USA        Pepsi    Pepsi_USA  
 2    200   21/3/2012     IBM    IBM_USA        Coke     Coke_UK
 3    300   12/3/2012     IBM    IBM_USA        Pepsi    Pepsi_USA
 4    1100  22/3/2012     Pepsi  IBM_Aus        IBM      IBM_USA

这里所有 4 个字段,如 s_pName s_cName b_pName b_cName 都可以是saler或buyer。 如何在 neo4j 中对该数据集进行建模,以便当我使用 gremlin 进行查询时,

select b_CName,id,amount,date from tableName where s_cName = IBM_USA,IBM_AUS;

【问题讨论】:

    标签: neo4j cypher gremlin


    【解决方案1】:

    我在 gremlin-users 邮件列表中也注意到了您的问题(您提供了有关您尝试过的事情的更多信息):https://groups.google.com/forum/#!topic/gremlin-users/AxsF2eJvpOA

    我确信有几种方法可以解决此建模问题,因此我将提供一些需要考虑的事项,希望它们能启发您找到解决方案。首先,不要考虑买家和卖家,只需考虑这样一个事实,即您拥有向其他公司出售商品的“公司”并且公司具有等级制度(这意味着公司可以有母公司)。然后您的模型归结为:

    company --sellsTo--> company
    company --parent--> company
    

    将您的交易金额和日期放在“sellsTo”边上,在数据集中每行创建一个这样的边。在公司顶点的“companyName”字段上创建一个关键索引,以便您可以查找公司。你的 Gremlin 会是这样的:

    ['IBM_USA','IBM_AUS'].collect{g.V('companyName',it).next()}._().outE('sellsTo').as('tx').inV.as('buyer').select{[it.id, it.amount, it.date]}{it.companyName}
    

    因此,您可以通过companyName 上的关键索引来查找您关心的两家公司,然后使用_() 将它们放入管道中。然后你遍历这两家公司出售给的公司。您使用select 来获取tx(事务边缘)和buyer 顶点,对它们中的每一个执行闭包以将它们转换为您想要的字段,这将产生类似的结果(对于一个结果,您的Gremlin 可能会显然,用你的完整数据集返回其中的几个):

    [[1,100,2/3/2012],Pepsi_USA]
    

    如果这不是您需要的最终格式,您可以使用一些 Groovy JDK (http://groovy.codehaus.org/groovy-jdk/) 操作来进一步转换它。

    【讨论】:

    • 感谢斯蒂芬。一个疑问..所以最初在创建节点和边缘时。我应该用 attribues 创建 customerNode 吗?考虑将第一行(IBM_USA 和 PEPSI_USA)与它们配对?
    • 根据我提供的模型,您的加载策略将是遍历每一行数据,通过我建议您创建的 companyName 字段上的键索引查找“公司”顶点。如果它不存在,则创建它。对买方和卖方字段(对于子字段和父字段)执行此操作,并在它们之间建立“父”边缘(如果其中任何一个是新的)。最后一步是添加“sellsTo”边缘。您应该能够在文件的一次传递中完成所有这些操作。
    • 我不知道您的确切数据大小,但请考虑使用 BatchGraph (github.com/tinkerpop/blueprints/wiki/Batch-Implementation)。这将有助于使代码更容易。
    猜你喜欢
    • 1970-01-01
    • 2018-11-03
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多