在NEO4J建立关系

时间:2016-12-12 22:52:46

标签: neo4j

我将在序言中提到我是一个完整的数据库文件。我对任何形式的数据库都有0次经验,所以我知道我已经超出了我的想法。

背景:我为公司做Active Directory咨询,所以我经常查看客户的活动目录帐户的组成员身份。目前,我有一个PowerShell脚本将运行我的分析,但是,我发现它在大型组织中需要太长时间。我在想“必须有一个更好的方法”,所以我开始研究数据库。 NEO4J似乎是一个很好的解决方案,因为我应该能够将用户帐户或组链接为另一个组的成员。但是,在浏览文档和论坛后,我不知道如何创建这些链接。

我已成功导入了两个CSV,其中包含以下信息:

Users = DistinguishedName,SAMACCOUNTNAME,MemberOf

Groups = DistinguishedName,SAMACCOUNTNAME,MemberOf,Members

我想要做的是将所有用户和组中的字符串(DistinguishedName)与成员的组节点属性中的字符串进行匹配。成员是所有DistinguishedName(无论是用户还是组)的串联字符串。因此,如果具有DistinguishedName的节点与组的“members”属性中的字符串的一部分匹配,我想构建一个单向关系,如下所示:

user - [memberof] - >组

我能想到的最好的是以下代码,但我不知道我是否接近:

    Match(n)
    Match(u:user) WHERE n.Members CONTAINS u.DN
    Create (u)-[MS:Memberof]->((match)})

在PowerShell中,我知道如何实现这一目标(松散地翻译成与NEO4J世界相关):

   $groups = (all-groups)
   $AllUsersAndGroups = (all-objs)
   foreach ($line in $groups) {
   $line.relationship = $line | where {$_.members -contains    $AllUsersAndGrups.DistinguishedName}
    }

所以最后,我现在被困住了。我将继续研究它,但我想我会问社区,因为你们有经验和东西。

1 个答案:

答案 0 :(得分:1)

以下是您应该如何导入数据的示例(请注意,实际上并不需要冗余的Members列):

  • 导入(每批5000个,以避免资源问题)每个用户,并创建与其组的唯一关系:

    USING PERIODIC COMMIT 5000
    LOAD CSV WITH HEADERS FROM "file:///users.csv" AS u
    MERGE (u:User {DistinguishedName: u.DistinguishedName, SAMACCOUNTNAME: u.SAMACCOUNTNAME})
    MERGE (g:Group {DistinguishedName: u.MemberOf})
    MERGE (u)-[:Memberof]->(g);
    
  • 导入每个组,并创建与其父组的唯一关系(如果有):

    USING PERIODIC COMMIT 5000
    LOAD CSV WITH HEADERS FROM "file:///groups.csv" AS g1
    MERGE (:Group {DistinguishedName: g1.DistinguishedName, SAMACCOUNTNAME: g1.SAMACCOUNTNAME})
    MERGE (g2:Group {DistinguishedName: g1.MemberOf})
    MERGE (g1)-[:Memberof]->(g2);