我试图了解neo4j的有效使用模式,特别是参考高度节点.为了解我正在谈论的内容,我的User节点具有我已建模为节点的属性.所以我的表中有关系如
(:User)-[:HAS_ATTRIB]->(:AgeCategory)
Run Code Online (Sandbox Code Playgroud)
等等等等.问题是这些AgeCategory节点中的一些节点非常高,大约为100k,而查询如
MATCH (u:User)-->(:AgeCategory)<--(v:User), (u)-->(:FavoriteLanguage)<--(v)
WHERE u.uid = "AAA111" AND v.uid <> u.uid
RETURN v.uid
Run Code Online (Sandbox Code Playgroud)
(匹配所有共享相同年龄类别和喜欢的语言的用户AAA111)非常非常慢,因为您必须为FavoriteLanguage链表中的每个元素运行一次AgeCategory链表(或者至少我理解它的方式).
我认为很明显,这个查询需要花费几分钟来解决我做错了什么,但我很好奇处理这样的查询的正确程序是什么.我应该从每个查询中单独下拉匹配用户并将它们与内存中的哈希进行比较吗?有没有办法在节点上建立关系?对于架构开始,这是一个好主意吗?
小智 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
Run Code Online (Sandbox Code Playgroud)
对于10,000个v节点,此查询大约需要2000毫秒,查询大约需要27000毫秒.
使用100,000 v节点,此查询大约需要10500毫秒,这似乎与您的原始查询永远不同.
因此,您可以尝试使用此查询,看看它是否可以提高图表的性能.