我想知道何时能够使用自己的函数在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])这样的东西就像myResult一样。“
提前致谢。
答案 0 :(得分: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)
答案 1 :(得分: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与前一个关系的乘法相加。 一个主意 ?再次感谢。