在Neo4j中建立关系

时间:2016-03-02 00:02:47

标签: neo4j cypher relationships

我有一个大约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在节点之间创建关系。 有人知道查询以这种方式创建关系吗?

2 个答案:

答案 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)])