2017-06-04 151 views
1

我有一个节点网络代表它们通过关系连接(电子邮件)。Neo4J - 如何基于分割现有关系属性并自动创建链接来创建新节点?

的邮件的接收者是m.slug

基于:() - [R] - (M)

我要拆分的属性(在这种情况下“发件人“/ m.slug即[email protected])并创建一个新的节点”Google.com“AS公司(即现在我有一组公司节点是根据现有信息创建的)。

我想然后将Google(公司)链接到我的人员节点([email protected])。

-

您会如何处理此问题,而不会创建多个重复的公司节点? (即对于[email protected] & [email protected]应连接到同一Google.com公司节点)。

Visual Representation of People and relationships

Example syntax of queries and relationship properties

回答

1

这是你如何能保证有每个电子邮件地址域名的唯一Company节点,它(通过AT关系),每个Person与电子邮件地址关联该域名。域名在存储之前是较低的,以确保唯一性,因为电子邮件地址经常以不同的形式出现。

MATCH (n:Person) 
MERGE (c:Company {name: TOLOWER(SPLIT(n.slug, '@')[1])}) 
CREATE (n)-[:AT]->(c); 

注:上面的查询只执行一次,因为CREATE子句将创建关系每一次,即使它已经存在。如果需要多次运行查询,则可以用MERGE代替CREATE

+0

感谢萨姆 - 我试图运行上面的代码并获得 _“使用空属性值的名称Neo.ClientError.Statement.SemanticError 不能合并节点” _ - 我试图然后更改的名称查询公司名称 'MATCH(n:Person) MERGE(c:Company {公司名称:TOLOWER(SPLIT(n.slug,'@')[1])}) CREATE(n) - [:AT] - >(c);' _但是,我收到了相同的回复,现在创建了两个不能使用的关系属性(名称和公司名称) 任何想法? – MShariff

+0

似乎并非所有的'slug'值都有'@'字符。在进行上述查询之前,您应该清理数据以确保所有'slug'值是有效的电子邮件地址。 – cybersam

相关问题