我有一个大约800k节点的图表,我想使用Cypher在它们之间创建随机关系。
以下的例子没有用,因为笛卡儿积太大了:
SPLT_REC1 = load '/user/hduser/output/realdata/pig_out6/part-m-00000' as (tran_array:chararray);
register /home/cloudera/workspace/SplitRec.jar;
define SplitRec com.Hadoop.pig.SplitRec();
SPLT_REC2 = foreach SPLT_REC1 generate SplitRec(tran_array);
store SPLT_REC2 into '/user/hduser/output/realdata/pig_out7';
package com.Hadoop.pig;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.util.WrappedIOException;
@SuppressWarnings("deprecation")
public class SplitRec extends EvalFunc<String> {
public String exec(Tuple input) throws IOException {
if (input == null || input.size() == 0)
return null;
try {
String Str1 = (String)input.get(0);
String delim1 = "PIMF+";
String[] tokens1 = Str1.split(delim1);
String part3 = tokens1[0];
String part4 = tokens1[1];
int len1 = part4.length();
String part5 = part4.substring(8,len1);
String conCat1 = part3+":"+part5;
return conCat1;
}
catch(Exception e) {
throw WrappedIOException.wrap("Caught exception processing input row ", e);
}
}
例如,我希望每个节点有一个关系(800k),或者每个节点需要10个关系(8M)。
简而言之,我需要查询Cypher以便UNIFORMLY在节点之间创建关系。 有人知道查询以这种方式创建关系吗?
答案 0 :(得分:0)
所以你希望每个节点都有完全{
public static void main (String[] args)
{
int start =Integer.parseInt(args[0]);
int count =Integer.parseInt(args[1]);
int[] prime = new int[count];
public static boolean check(int a)
{
if (a%2==0)
return false;
for(int i=3;i*i<=a;i+=2)
{
if(a%i==0)
return false;
}
return true;
}
}
的关系?分批尝试,直到不再更新关系:
x
答案 1 :(得分:0)
这应该有效(假设您的neo4j服务器有足够的内存):
MATCH (n)
WITH COLLECT(n) AS ns, COUNT(n) AS len
FOREACH (i IN RANGE(1, {numLinks}) |
FOREACH (x IN ns |
FOREACH(y IN [ns[TOINT(RAND()*len)]] |
CREATE (x)-[:LINK]->(y) )));
此查询收集所有节点,并使用嵌套循环执行以下{numLinks}
次:在每个节点和随机选择的节点之间创建LINK
关系。
最里面的FOREACH
用作当前Cypher限制的变通方法,您无法在节点模式中放置返回节点的操作。具体而言,这是非法的:CREATE (x)-[:LINK]->(ns[TOINT(RAND()*len)])
。