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(); }
/** * @param GraphSchema $schema * @param null|int $seed * @return Graph */ public function process(GraphSchema $schema, $seed = null) { $this->nodesByIdentifier = new ObjectCollection(); $this->nodes = new ObjectCollection(); $this->relationships = new ObjectCollection(); foreach ($schema->getNodes() as $node) { $this->processNodeDefinition($node, $seed); } foreach ($schema->getRelationships() as $relationship) { $this->processRelationshipDefinition($relationship, $seed); } $graph = new Graph(); $graph->setNodes($this->nodes); $graph->setEdges($this->relationships); $graph->setSchema($schema); return $graph; }
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(); }
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 serializeGraphToJson(Graph $graph) { return $this->serializer->serialize($graph->toArray(), 'json'); }