Example #1
0
 public function convert(Graph $graph)
 {
     foreach ($graph->getNodes() as $node) {
         if (!in_array($node['identifier'], $this->identifiers)) {
             $this->identifiers[] = $node['identifier'];
             $this->setClusterForLabel($node['identifier']);
         }
         $n = [];
         $n['_id'] = $node['neogen_id'];
         $n['identifier'] = $node['identifier'];
         $n['properties'] = $node['properties'];
         $n['labels'] = $node['labels'];
         $n['cluster'] = $this->clusterColors[$node['identifier']];
         $this->nodes[] = $n;
     }
     foreach ($graph->getEdges() as $edge) {
         $e = [];
         $e['_source'] = $edge['source'];
         $e['_target'] = $edge['target'];
         $e['type'] = $edge['type'];
         $e['properties'] = $edge['properties'];
         $e['source_label'] = $edge['source_label'];
         $e['target_label'] = $edge['target_label'];
         $this->edges[] = $e;
     }
     $this->buildStyle();
     return $this->toJSON();
 }
 public function convert(Graph $graph)
 {
     $labels = [];
     $identifierToLabelMap = [];
     $nodesByIdentifier = [];
     foreach ($graph->getNodes() as $node) {
         $nodesByIdentifier[$node['identifier']][] = $node;
         if (!array_key_exists($node['identifier'], $identifierToLabelMap)) {
             $identifierToLabelMap[$node['identifier']] = $node['labels'][0];
             $labels[] = $node['labels'][0];
         }
     }
     foreach ($nodesByIdentifier as $nodeIdentifier => $node) {
         $identifier = strtolower($nodeIdentifier);
         $label = $identifierToLabelMap[$nodeIdentifier];
         $ccs = 'CREATE CONSTRAINT ON (' . $identifier . ':' . $label . ') ASSERT ' . $identifier . '.neogen_id IS UNIQUE;';
         $this->statements[] = $ccs;
     }
     $i = 1;
     foreach ($graph->getNodes() as $node) {
         $label = $identifierToLabelMap[$node['identifier']];
         $labelsCount = count($node['labels']);
         if (!isset($node['neogen_id']) && isset($node['_id'])) {
             $node['neogen_id'] = $node['_id'];
         }
         $identifier = 'n' . $i;
         $statement = 'MERGE (' . $identifier . ':' . $label . ' {neogen_id: \'' . $node['neogen_id'] . '\' })';
         if ($labelsCount > 1) {
             $statement .= 'SET ';
             $li = 1;
             foreach ($node['labels'] as $lbl) {
                 if ($lbl !== $label) {
                     $statement .= $identifier . ' :' . $lbl;
                     if ($li < $labelsCount) {
                         $statement .= ', ';
                     }
                 }
                 $li++;
             }
         }
         $statement .= PHP_EOL;
         if (!empty($node['properties'])) {
             if ($labelsCount > 1) {
                 $statement .= ', ';
             } else {
                 $statement .= 'SET ';
             }
             $xi = 1;
             $propsCount = count($node['properties']);
             foreach ($node['properties'] as $prop => $value) {
                 if (is_string($value)) {
                     $val = '\'' . addslashes($value) . '\'';
                 } elseif (is_int($value)) {
                     $val = $value;
                 } elseif (is_float($value)) {
                     $val = $value;
                 } else {
                     $val = addslashes($value);
                 }
                 $statement .= $identifier . '.' . $prop . ' = ' . $val;
                 if ($xi < $propsCount) {
                     $statement .= ', ';
                 }
                 $xi++;
             }
         }
         $statement .= ';';
         $this->statements[] = $statement;
         $i++;
     }
     $e = 1;
     foreach ($graph->getEdges() as $rel) {
         $starti = 's' . $e;
         $endi = 'e' . $e;
         $eid = 'edge' . $e;
         $q = 'MATCH (' . $starti . ':' . $rel['source_label'] . ' {neogen_id: \'' . $rel['source'] . '\'}), (' . $endi . ':' . $rel['target_label'] . ' { neogen_id: \'' . $rel['target'] . '\'})' . PHP_EOL;
         $q .= 'MERGE (' . $starti . ')-[' . $eid . ':' . $rel['type'] . ']->(' . $endi . ')' . PHP_EOL;
         if (empty($rel['properties'])) {
             $q .= ';';
         }
         if (!empty($rel['properties'])) {
             $q .= 'SET ';
             $xi = 1;
             $propsCount = count($rel['properties']);
             foreach ($rel['properties'] as $prop => $value) {
                 if (is_string($value)) {
                     $val = '\'' . addslashes($value) . '\'';
                 } elseif (is_int($value)) {
                     $val = $value;
                 } elseif (is_float($value)) {
                     $val = $value;
                 } else {
                     $val = addslashes($value);
                 }
                 $q .= $eid . '.' . $prop . ' = ' . $val;
                 if ($xi < $propsCount) {
                     $q .= ', ';
                 }
                 $xi++;
             }
             $q .= ';';
         }
         $this->statements[] = $q;
         $e++;
     }
     $ssi = 1;
     foreach ($labels as $label) {
         $this->statements[] = 'MATCH (n' . $ssi . ':' . $label . ') REMOVE n' . $ssi . '.neogen_id;';
         $ssi++;
     }
     return $this->statements;
 }
 public function convert(Graph $graph)
 {
     $labels = [];
     $nodesByIdentifier = [];
     $identifierToLabelMap = [];
     $edgesByType = [];
     $edgeTypes = [];
     foreach ($graph->getNodes() as $node) {
         $nodesByIdentifier[$node['identifier']][] = $node;
         if (!array_key_exists($node['identifier'], $identifierToLabelMap)) {
             $identifierToLabelMap[$node['identifier']] = $node['labels'][0];
             $labels[] = $node['labels'][0];
         }
     }
     // Creating constraints statements
     foreach ($nodesByIdentifier as $nodeIdentifier => $node) {
         $identifier = strtolower($nodeIdentifier);
         $label = $identifierToLabelMap[$nodeIdentifier];
         $ccs = 'CREATE CONSTRAINT ON (' . $identifier . ':' . $label . ') ASSERT ' . $identifier . '.neogen_id IS UNIQUE';
         $cst = ['statement' => $ccs];
         $this->constraintsStatements[] = $cst;
     }
     // Creating node creation statements
     foreach ($nodesByIdentifier as $key => $type) {
         if (!isset($type[0])) {
             continue;
         }
         $node = $type[0];
         $label = $node['labels'][0];
         $labelsCount = count($node['labels']);
         $idx = strtolower($key);
         $q = 'UNWIND {props} as prop' . PHP_EOL;
         $q .= 'MERGE (' . $idx . ':' . $label . ' {neogen_id: prop.neogen_id})' . PHP_EOL;
         if ($labelsCount > 1) {
             $q .= 'SET ';
             $li = 1;
             foreach ($node['labels'] as $lbl) {
                 if ($lbl !== $label) {
                     $q .= $idx . ' :' . $lbl;
                     if ($li < $labelsCount) {
                         $q .= ', ';
                     }
                 }
                 $li++;
             }
         }
         $propsCount = count($node['properties']);
         if ($propsCount > 0) {
             if ($labelsCount > 1) {
                 $q .= ', ';
             } else {
                 $q .= 'SET ';
             }
             $i = 1;
             foreach ($node['properties'] as $property => $value) {
                 $q .= $idx . '.' . $property . ' = prop.properties.' . $property;
                 if ($i < $propsCount) {
                     $q .= ', ';
                 }
                 $i++;
             }
         }
         $nts = ['statement' => $q, 'parameters' => ['props' => $nodesByIdentifier[$key]]];
         $this->nodeStatements[] = $nts;
     }
     foreach ($graph->getEdges() as $edge) {
         $edgeType = $edge['source_label'] . $edge['type'] . $edge['target_label'];
         if (!in_array($edgeType, $edgeTypes)) {
             $edgeTypes[] = $edgeType;
         }
         $edgesByType[$edgeType][] = $edge;
     }
     // Creating edge statements
     $i = 1;
     foreach ($edgesByType as $type => $rels) {
         if (!isset($type[0])) {
             continue;
         }
         $rel = $rels[0];
         $q = 'UNWIND {pairs} as pair' . PHP_EOL;
         $q .= 'MATCH (start:' . $rel['source_label'] . ' {neogen_id: pair.source}), (end:' . $rel['target_label'] . ' {neogen_id: pair.target})' . PHP_EOL;
         $q .= 'MERGE (start)-[edge:' . $rel['type'] . ']->(end)' . PHP_EOL;
         $propsCount = count($rel['properties']);
         if ($propsCount > 0) {
             $q .= 'SET ';
             $i = 1;
             foreach ($rel['properties'] as $property => $value) {
                 $q .= 'edge.' . $property . ' = pair.properties.' . $property;
                 if ($i < $propsCount) {
                     $q .= ', ' . PHP_EOL;
                 }
                 $i++;
             }
         }
         $ets = ['statement' => $q, 'parameters' => ['pairs' => $edgesByType[$type]]];
         $this->edgeStatements[] = $ets;
         $i++;
     }
     $this->addRemoveIdsStatements($labels);
     return $this->getStatements();
 }