我将在序言中提到我是一个完整的数据库文件。我对任何形式的数据库都有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}
}
所以最后,我现在被困住了。我将继续研究它,但我想我会问社区,因为你们有经验和东西。
答案 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);