我试图了解neo4j的有效使用模式,特别是参考高度节点。为了了解我在说什么,我有User
个节点,这些节点具有我已建模为节点的属性。所以我的表格中有关系,例如
(:User)-[:HAS_ATTRIB]->(:AgeCategory)
依此类推。问题是这些AgeCategory
节点中的一些节点非常高,大约为100k,而查询如
MATCH (u:User)-->(:AgeCategory)<--(v:User), (u)-->(:FavoriteLanguage)<--(v)
WHERE u.uid = "AAA111" AND v.uid <> u.uid
RETURN v.uid
(匹配与AAA111
共享相同年龄类别和喜爱语言的所有用户)非常非常慢,因为您必须为FavoriteLanguage
链接列表运行一次AgeCategory
链接列表{1}}链表(或至少我理解的方式)。
我认为很明显,这个查询需要花费几分钟来解决我做错了什么,但我很好奇处理这样的查询的正确程序是什么。我应该从每个查询中单独下拉匹配用户并将它们与内存中的哈希进行比较吗?有没有办法在节点上建立关系?这是一个以架构开头的好主意吗?
答案 0 :(得分:6)
我的直觉是,首先检索给定节点u的两个端点(AgeCategory和FavoriteLanguage)会更有效,然后在中间节点v中查询具有这两个固定端点的路径。
为了证明这一点,我创建了一个包含以下组件的测试图,
我运行以下查询10次,平均运行时间为10500毫秒。
Match l:FavoriteLanguage<-[:LIKE_LANGUAGE]-u:User-[:HAS_AGE]->c:AgeCategory
Where u.uid = 'AAA111'
With l,c
Match l<-[:LIKE_LANGUAGE]-v:User-[:HAS_AGE]->c
Where v.uid <> 'AAA111'
Return v.uid
对于10,000个v节点,此查询大约需要2000毫秒,查询大约需要27000毫秒。
使用100,000 v节点时,此查询大约需要10500毫秒,这似乎需要您原始查询的永久性。
因此,您可以尝试使用此查询,看看它是否可以提高图表的性能。