def apply(x): if isinstance(x, dict): inst.update(x) elif is_collection(x): for item in x: apply(item) elif isinstance(x, string_types): inst.add_label(ustr(x)) else: raise TypeError("Cannot cast %s to Node" % obj.__class__.__name__)
def _query_and_parameters(self, count=False): """ A tuple of the Cypher query and parameters used to select the relationships that match the criteria for this selection. :return: Cypher query string """ def verify_node(n): if n.graph != self.graph: raise ValueError("Node %r does not belong to this graph" % n) if n.identity is None: raise ValueError("Node %r is not bound to a graph" % n) def r_type_name(r): try: return r.__name__ except AttributeError: return r clauses = [] parameters = {} if self._r_type is None: relationship_detail = "" elif is_collection(self._r_type): relationship_detail = ":" + "|".join( cypher_escape(r_type_name(t)) for t in self._r_type) else: relationship_detail = ":%s" % cypher_escape( r_type_name(self._r_type)) if not self._nodes: clauses.append("MATCH (a)-[_" + relationship_detail + "]->(b)") elif isinstance(self._nodes, Sequence): if len(self._nodes) >= 1 and self._nodes[0] is not None: start_node = Node.cast(self._nodes[0]) verify_node(start_node) clauses.append("MATCH (a) WHERE id(a) = $x") parameters["x"] = start_node.identity if len(self._nodes) >= 2 and self._nodes[1] is not None: end_node = Node.cast(self._nodes[1]) verify_node(end_node) clauses.append("MATCH (b) WHERE id(b) = $y") parameters["y"] = end_node.identity if len(self._nodes) >= 3: raise ValueError("Node sequence cannot be longer than two") clauses.append("MATCH (a)-[_" + relationship_detail + "]->(b)") elif isinstance(self._nodes, Set): nodes = {node for node in self._nodes if node is not None} if len(nodes) >= 1: start_node = Node.cast(nodes.pop()) verify_node(start_node) clauses.append("MATCH (a) WHERE id(a) = $x") parameters["x"] = start_node.identity if len(nodes) >= 1: end_node = Node.cast(nodes.pop()) verify_node(end_node) clauses.append("MATCH (b) WHERE id(b) = $y") parameters["y"] = end_node.identity if len(nodes) >= 1: raise ValueError("Node set cannot be larger than two") clauses.append("MATCH (a)-[_" + relationship_detail + "]-(b)") else: raise ValueError("Nodes must be passed as a Sequence or a Set") if self._predicates: predicates = [] for predicate in self._predicates: if isinstance(predicate, tuple): predicate, param = predicate parameters.update(param) predicates.append(predicate) clauses.append("WHERE %s" % " AND ".join(predicates)) if count: clauses.append("RETURN count(_)") else: clauses.append("RETURN _") if self._order_by: clauses.append("ORDER BY %s" % (", ".join(self._order_by))) if self._skip: clauses.append("SKIP %d" % self._skip) if self._limit is not None: clauses.append("LIMIT %d" % self._limit) return " ".join(clauses), parameters