Neo4J只访问内圈节点一次

时间:2014-01-10 11:11:03

标签: neo4j cypher

我有一个Cypher查询返回闭合循环结果,如

a-b-t-y-a
b-t-y-w-b 

依旧......

我不时会得到像

这样的结果
a-b-c-b-e-f-a
c-e-r-e-f-g-c
c-e-r-c-d-a-c

我不需要

在这两个结果中,我首先使用b-in,然后第二次访问e,两次,c是 不仅在开始和结束时也应该显示,但也在中间。  

如何避免得到结果,我在结果的内部部分获得相同的节点或者也可以将开始和结束节点放在里面。结果的开始和结束处的相同节点都可以。

我当前的密码查询是:

start n=node(*) match p=n-[r:OWES*1..200]->n   
where  HAS(n.taxnumber) 
return extract(s in `relationships(p) : s.amount), extract(t in nodes(p) : ID(t)), length(p); 

我得到的所有节点都有taxnumber属性并且与关系OWES有关 达到200级。

2 个答案:

答案 0 :(得分:2)

如果您无法使用CASE,可以试试这个。我在1.8.3服务器上测试它运行正常。我无法让它与reduce一起工作。我得到了几个不同的意外错误,包括'未闭合的括号'和类型比较问题,这是我唯一的工作查询。我也在2.0服务器上运行它,大约在39秒内完成了Michael对case和reduce的查询在一个模型数据集上的~23s。

START n=node(*) 
MATCH p=n-[r:OWES*1..200]->n 
WHERE HAS(n.taxnumber) AND 
    ALL(x IN tail(nodes(p)) WHERE SINGLE(y IN tail(nodes(p)) WHERE x=y))        
RETURN EXTRACT(s IN relationships(p) : s.amount), EXTRACT(t IN nodes(p) : ID(t)), length(p)

答案 1 :(得分:1)

你不能检查路径中的非重复项吗? 现在cypher错过了一个简单的uniq函数,这是一个解决方法。

这是针对neo4j 2.0的,因为1.9可能会涉及更多的情况,可能使用过滤器

start n=node(*) 
match p=n-[r:OWES*1..200]->n   
where HAS(n.taxnumber) AND 
  reduce(a=tail(nodes(p)), x in tail(nodes(p)) |
      case when a IS NOT null OR x in tail(a) then null else tail(a) end) IS NOT NULL
return extract(s in relationships(p) | s.amount), extract(t in nodes(p) | ID(t)), length(p); 

for 1.9你可以使用这样的表达式来查找重复项:

WITH [1,2,3] AS coll

reduce(a=false, x IN coll : a OR length(filter(y IN coll : x = y))> 1)

它的工作原理如下:

  • 使用tail(节点(路径))b / c你有相同的起始和结束节点,它总是重复的
  • 它减少了集合的所有元素,当它在集合的其余部分中没有再次找到该元素时,它返回集合的其余部分并重复
  • 否则返回null和快捷方式