1

我想知道什么时候可以使用自己的函数在 Cypher 中创建计算字段。

让我给你一个我想要的例子:

START a=node(0)
MATCH path=a-[rel*1..3]->b
WITH path,b,extract(r in RELATIONSHIPS(path) : r.property1) as Collection1,extract(r in RELATIONSHIPS(path) : r.property2) as Collection2
RETURN b,Collection1,Collection2

它会给我类似的东西:

Collection1 :             | Collection2 :
[property1.1,property1.2] | [property2.1,property2.2]
[property1.1]             | [property2.1]
etc.

我想添加一个带有 property1.1*property2.1+property1.2*property2.2 和其他一些函数的字段(如 exp() 和 ln(),它们在 cypher2.0 中对吗?)。今天可以用 cypher 做到这一点吗?我知道有 Reduce() 函数,但我怎样才能同时通过 2 个集合?

如果我可以调用自己的函数,那将对我有所帮助:类似于“myFunction([collection1],[collection2]) as myResult”。

提前致谢。

4

2 回答 2

1

我同意对用户定义函数的支持会非常有帮助。但在许多情况下,可能有替代方案可以实现目标。具体到您的情况,您似乎想根据每个关系的属性进行计算。因此,您可以将每个关系作为单独的行返回,然后处理这些关系行,而不是将关系作为路径上的关系集合来检索。

例如,以下查询返回关系属性 p1 和 p2 的乘积之和,

START a=node(0)
MATCH path=a-[rel*1..3]->b
with last(relationships(path)) as r
With r.p1 * r.p2 as mul
Return sum(mul) 

对于这个特定的问题,由于属性 p1 和 p2 来自同一个关系,实际上有一个非常简单的方法可以做到这一点,就像你已经做过的那样,

START a=node(0)
MATCH path=a-[rel*1..3]->b
With b, extract(r IN RELATIONSHIPS(path):r.p1 * r.p2) AS mulCol
Return b, reduce((sum = 0, mul in mulCol: sum + mul)
于 2013-09-06T17:48:39.947 回答
0

好的我明白了。让我们试试 neo4j 控制台:

CREATE (a { name:'a' }),(b { name:'b' }),(c { name:'c' }),(d { name:'d' }),(e { name:'e' }),(f { name:'f' }), a-[:RELATION { p1:1,p2:10 }]->b, a-[:RELATION { p1:2,p2:2 }]->d, b-[:RELATION { p1: 3,p2:5 }]->c, c-[:RELATION { p1: 2,p2:5 }]->e,d-[:RELATION { p1: 1,p2:6 }]->e, d-[:RELATION { p1: 4,p2:5 }]->f

让我们试试我的查询:

START a=node:node_auto_index(name='a')
MATCH path = a-[R*1..3]->b 
WITH b,extract(r IN RELATIONSHIPS(path):r.p1) AS collection_p1,extract(r IN RELATIONSHIPS(path):r.p2) AS collection_p2 
RETURN b,collection_p1,collection_p2

我需要它,但还有一个字段:如果路径中有 2 个关系,我需要 (collection_p1[1]*collection_p2[1] + collection_p1[2]*collection_p2[2]) 作为我的结果(当然对于每一行)。

如果我尝试您的查询,我无法获得每个节点 b 先前关系的总和。

START a=node:node_auto_index(name='a')
MATCH path = a-[R*1..3]->b
WITH last(relationships(path)) AS r ,b
WITH r.p1 * r.p2 AS mul,b
RETURN sum(mul),b

显然,我需要将所有节点 b 与先前关系的乘积相加。一个想法 ?再次感谢。

于 2013-09-10T15:26:09.983 回答