2014-09-03 95 views
3

我有一个图表,当前有几千个节点,每个节点有两到十个关系。如果我们看一下在单个节点及其连接,它们看起来像有些这样的: Node and relating nodes限制每个标签的节点

与字母字符的节点是分类节点。所有其他节点都是与这些类别节点具有associated with关系的内容节点,并且它们的颜色表示将哪些标签附加到它。为简单起见,每个节点都有一个标签,每个节点只连接到单个其他节点:

  • 蓝:分类
  • 绿色:科学出版社
  • 橙色:一般条款
  • 紫色:博客文章

现在,我试图做的最简单的事情是获取一定数量的相关内容节点到给定节点。下面收益全部二十相关节点:

START n = node(1) 
MATCH (n)-->(category)<--(m) 
RETURN m 

不过,我想每个类别此过滤每个标签可以2个节点(事后由具有多个类别与起始节点重叠的节点与排序播放

目前,我从上面的查询手动得到结果,然后在结果循环这样做,但这种感觉就像多余的工作给我。

有没有办法通过的Neo4j的密码查询语言要做到这一点?

回答

3

这个答案延伸@斯特凡的原始答案,返回所有类别的结果,而不仅仅是其中的一个。

START p = node(1) 
MATCH (p)-->(category)<--(m) 
WITH category, labels(m) as label, collect(m)[0..2] as nodes 
UNWIND label as lbl 
UNWIND nodes AS n 
RETURN category, lbl, n 

为了便于手动验证结果,还可以将此行添加到最后以对结果进行排序。 (此排序可能不应该是你的最终代码,除非你真的需要排序结果,并愿意花费额外的计算时间):

ORDER BY id(category), lbl 
+0

谢谢,这确实是我正在寻找的。 – Aeveus 2014-09-09 14:23:25

3

Cypher有一个labels函数返回给定节点的所有标签的数组。假设你只有每m节点只有一个标签下面的办法可以工作:

START n = node(1) 
MATCH (n)-->(category)<--(m) 
WITH labels(m)[0] as label, collect[m][0..2] as nodes 
UNWIND nodes as n 
RETURN n 

WITH陈述建立起共享相同标签的所有节点的单独的集合。使用下标运算符[0..2]集合只保留前两个元素。 Unwind然后将集合转换为结果的单独行。从这里开始,您可以申请订购。

+0

不知该停在遇到的第一类节点。在上面的图表上运行这个返回4个节点(即2,3,4和6),如果我只有一个类别,这确实是我想要的,然而,在这种情况下,我正在寻找除4之外的所有数值节点其中:16.“collect”方法是否被覆盖? – Aeveus 2014-09-03 13:37:33

+0

哦,我看到,“collect”会创建2个组,每个标签之一(因此分别具有8和12)。做类似'collect(m)[0..8]'的操作会返回16个节点,每个标签返回正确的金额,但是每个类别的每个标签不会返回2个。 – Aeveus 2014-09-03 13:44:58