在neo4j最初未知时建立关系

时间:2017-02-06 15:47:21

标签: go neo4j cypher

我目前有一些代码可以查看各种数据集并模拟它们之间的电子关系。例如,JSESSIONID。

我想模拟每个用户与应用程序的交互,他们必须提交唯一标识符。例如,电子邮件地址。

在处理应用程序的日志时,我看到emailA@host.com使用带有JSESSIONID asdfghjkl的应用程序。然后我看到emailB@host.com也使用了与JESSIONID asdfghjkl的applcation。最后,我看到emailB@host.com使用JSESSIONID qwertyuiop。

在我的代码中,我很容易处理日志并将emailA@host.com和emailB@host.com写成节点,然后在它们之间写下JSESSIONID关系。

MERGE (a:EMAIL {label:userA@host.com}) MERGE (b:EMAIL {label:userB@host.com}) MERGE (a)-[:asdfghjkl]-(b)

但是,我不知道大规模这样做的最好方法。 (即,应用程序日志的大小为1TB)。限制是内存 - 我无法找到所有使用asdfghjkl作为SessionID而不处理所有数据的电子邮件地址,所以由于内存限制,我无法写出它们之间的关系。

我真正想做的是写出如下的内容,但这显然是失败的:

MERGE (a:EMAIL {label:userA@host.com}) (a)-[:asdfghjkl]

然后:     MERGE(b:EMAIL {label:userB@host.com})(b) - [:asdfghjkl]

事后可以用查询创建这些关系吗?

1 个答案:

答案 0 :(得分:1)

听起来你应该将JSESSIONID建模为节点而不是关系,因为这样可以将JSESSIONID链接到多个电子邮件地址,并且可以在id上添加唯一约束以便快速查找。

MERGE (a:EMAIL {label:userA@host.com}) 
MERGE (b:EMAIL {label:userB@host.com}) 
MERGE (jsid:JSESSIONID {id:'asdfghjkl'})
MERGE (a)-[:jsid]->(jsid)
MERGE (b)-[:jsid]->(jsid)

您的查询以查找所有:使用特定JSESSION ID的EMAIL节点应该非常快:

MATCH (email:EMAIL)-[:jsid]->(jsid:JSESSIONID {id:'asdfghjkl'})
RETURN email