Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有两个集合的计算字段_Java_Neo4j_Cypher - Fatal编程技术网

Java 具有两个集合的计算字段

Java 具有两个集合的计算字段,java,neo4j,cypher,Java,Neo4j,Cypher,我想知道什么时候我可以使用我自己的函数在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,Collecti

我想知道什么时候我可以使用我自己的函数在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(),但如何同时处理两个集合

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


提前感谢。

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

例如,以下查询返回关系属性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)

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

例如,以下查询返回关系属性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)

好的,我明白了。让我们试试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
我需要它,但还有一个字段:如果路径中有两个关系,我需要(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和之前关系的乘积之和。
一个主意?再次感谢。

好的,我明白了。让我们试试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
我需要它,但还有一个字段:如果路径中有两个关系,我需要(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和之前关系的乘积之和。
一个主意?再次感谢。

谢谢你的回答。我想这样做,但是对于路径的每个关系,而不仅仅是最后一个。例如,如果路径中有两个关系,我想要R.p11*R.p12+R.p21*R.p22。如果有3个关系,我想要:R.p11*R.p12+R.p21*R.p22+R.p31*R.p32(其中pab,a作为关系的编号,b作为属性的编号)。你的建议是:R.p21*R.p22或R.p31*R.p32。我以前的关系怎么样?我需要它们。它检索每个返回路径的最后一个关系。因为每个返回的路径都是最后一个返回的路径加上一个新的关系,所以它实际上检索开始节点和结束节点之间的所有关系。例如,对于a->b->c->d之间的路径,“匹配路径=a-[rel:*1..3]->d”的查询将返回路径a->b、a->b->c和a->b->c->d。因此,通过检索每个返回路径的最后一个关系,您实际上得到了从a到d的所有关系,而不是从a到d的最后一个关系。谢谢您的回答。我想这样做,但是对于路径的每个关系,而不仅仅是最后一个。例如,如果路径中有两个关系,我想要R.p11*R.p12+R.p21*R.p22。如果有3个关系,我想要:R.p11*R.p12+R.p21*R.p22+R.p31*R.p32(其中pab,a作为关系的编号,b作为属性的编号)。你的建议是:R.p21*R.p22或R.p31*R.p32。我以前的关系怎么样?我需要它们。它检索每个返回路径的最后一个关系。因为每个返回的路径都是最后一个返回的路径加上一个新的关系,所以它实际上检索开始节点和结束节点之间的所有关系。例如,对于a->b->c->d之间的路径,“匹配路径=a-[rel:*1..3]->d”的查询将返回路径a->b、a->b->c和a->b->c->d。因此,通过检索每个返回路径的最后一个关系,您实际上获得了从a到d的所有关系,而不是从a到d的最后一个关系。在您的后续文章中,我添加了另一个查询,以满足您对每个返回路径(或每个路径的每个端点节点)总和的要求。看来我们想得太多了,其实比我想的容易多了。哦,我明白了。我没想到在“extract()”中使用p1*p2。我真的很接近。当然,我想做的比乘法复杂得多。我必须为一些数学函数安装Neo4j2.0。我的最后一个问题:如果我想用集合中的位置除以(p1*p2)(你明白吗?)例如,如果路径中有两个关系,有没有办法((集合p1[1]*集合p2[1])/1+(集合p1[2]*集合p2[2])/2)?就你的下一篇博文而言,我添加了另一个查询,以满足您对每个返回路径(或每个路径的每个端点节点)总和的要求。看来我们想得太多了