neo4j中的高度节点

时间:2013-08-27 15:32:01

标签: neo4j cypher

我试图了解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}}链表(或至少我理解的方式)。

我认为很明显,这个查询需要花费几分钟来解决我做错了什么,但我很好奇处理这样的查询的正确程序是什么。我应该从每个查询中单独下拉匹配用户并将它们与内存中的哈希进行比较吗?有没有办法在节点上建立关系?这是一个以架构开头的好主意吗?

1 个答案:

答案 0 :(得分:6)

我的直觉是,首先检索给定节点u的两个端点(AgeCategory和FavoriteLanguage)会更有效,然后在中间节点v中查询具有这两个固定端点的路径。

为了证明这一点,我创建了一个包含以下组件的测试图,

  1. 节点u:用户名为u.uid ='AAA111'
  2. 节点c:AgeCategory
  3. 节点l:FavoriteLanguage
  4. u和c之间的关系,u - [:HAS_AGE] - &gt; c
  5. 你和我之间的关系,你 - [:LIKE_LANGUAGE] - &gt; l
  6. 100,000个节点v,每个节点与相同的c:AgeCategory和l:带有ndoe u的FavoriteLanguage,即每个v连接到l和c,v - [:HAS_AGE] - &gt; c,v- [: LIKE_LANGUAGE] - →1
  7. 我运行以下查询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毫秒,这似乎需要您原始查询的永久性。

    因此,您可以尝试使用此查询,看看它是否可以提高图表的性能。