Go 在neo4j中建模最初未知的关系

Go 在neo4j中建模最初未知的关系,go,neo4j,cypher,Go,Neo4j,Cypher,我目前有一些代码,可以查看各种数据集,并为它们之间的电子关系建模。例如,JSSessionID 我想为每个用户与应用程序的交互建模,在应用程序中,他们必须提交唯一的标识符。例如,电子邮件地址 在处理应用程序的日志时,我看到emailA@host.com使用JSSessionID为asdfghjkl的应用程序。我明白了emailB@host.com还可以将应用程序与JESSIONID asdfghjkl一起使用。最后,我明白了emailB@host.com使用JSESSIONID qwertyui

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

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

在处理应用程序的日志时,我看到emailA@host.com使用JSSessionID为asdfghjkl的应用程序。我明白了emailB@host.com还可以将应用程序与JESSIONID asdfghjkl一起使用。最后,我明白了emailB@host.com使用JSESSIONID qwertyuiop

在我的go代码中,我很容易处理日志并写出它们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)
然而,我不知道在规模上这样做的最佳方法。i、 例如,应用程序日志的大小为1TB。内存是一个限制——如果不处理所有数据,我无法找到所有使用asdfghjkl作为会话ID的电子邮件地址,因此由于内存限制,我无法写出它们之间的关系

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

MERGE (a:EMAIL {label:userA@host.com}) (a)-[:asdfghjkl]
随后: 合并b:电子邮件{标签:userB@host.com}b-[:asdfghjkl]


我可以在事后通过查询创建这些关系吗?

听起来您应该将JSSessionID建模为节点,而不是关系,因为这将允许您将JSSessionID链接到多个电子邮件地址,并且您可以在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查找all:EMAIL节点的查询应该非常快:

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

不幸的是,我认为你是对的,我已经倾向于这样了。因为我的图表可能会变得相当大,所以我希望能够简化它,至少可以以图形方式查看。根据您建议的数据模型,是否有任何方法可以查询将JSESSION id作为关系而不是节点获取的位置?也就是说,a-[:jsid]-b而不是a-jsid-b?我不这么认为。特别是因为关系需要两个节点,Neo4j中不允许悬空关系,因此如果只有一个节点使用会话id,您将无法保存此信息。此外,您还需要弄清楚这将如何与使用相同id的多个电子邮件节点进行缩放。如果有5个,您如何对此进行建模?是否将所有5个节点相互连接?那似乎效率不高。你可能需要建立一些关系链。您也不能通过会话id进行快速查找,至少不能使用模式索引。不过,遗留索引可能会起作用。