diff --git a/src/planner/match/Expand.cpp b/src/planner/match/Expand.cpp index 1d6bab1461ac47f9bd63abbe2fd02aa55c4657ca..a6537dbd15c8ac9ff08a312f94163a409a2add02 100644 --- a/src/planner/match/Expand.cpp +++ b/src/planner/match/Expand.cpp @@ -90,32 +90,59 @@ Status Expand::doExpand(const NodeInfo& node, return Status::OK(); } +// (v)-[e]-() Status Expand::expandSteps(const NodeInfo& node, const EdgeInfo& edge, SubPlan* plan) { SubPlan subplan; - NG_RETURN_IF_ERROR(expandStep(edge, dependency_, inputVar_, node.filter, true, &subplan)); - // plan->tail = subplan.tail; - PlanNode* passThrough = subplan.root; + int64_t startIndex = 0; + auto minHop = edge.range ? edge.range->min() : 1; auto maxHop = edge.range ? edge.range->max() : 1; - for (int64_t i = 1; i < maxHop; ++i) { + + // In the case of 0 step, src node is the dst node, return the vertex directly + if (minHop == 0) { + subplan = *plan; + startIndex = 0; + // Get vertex + NG_RETURN_IF_ERROR(MatchSolver::appendFetchVertexPlan(node.filter, + matchCtx_->space, + matchCtx_->qctx, + initialExpr_.release(), + inputVar_, + subplan)); + // If maxHop > 0, the result of 0 step will be passed to next plan node + if (maxHop > 0) { + subplan.root = passThrough(matchCtx_->qctx, subplan.root); + } + } else { // Case 1 to n steps + startIndex = 1; + // Expand first step from src + NG_RETURN_IF_ERROR(expandStep(edge, dependency_, inputVar_, node.filter, &subplan)); + // Manualy create a passThrough node for the first step + // Rest steps will be passed through in collectData() + subplan.root = passThrough(matchCtx_->qctx, subplan.root); + } + + PlanNode* passThrough = subplan.root; + for (; startIndex < maxHop; ++startIndex) { SubPlan curr; NG_RETURN_IF_ERROR( - expandStep(edge, passThrough, passThrough->outputVar(), nullptr, false, &curr)); + expandStep(edge, passThrough, passThrough->outputVar(), nullptr, &curr)); auto rNode = subplan.root; DCHECK(rNode->kind() == PNKind::kUnion || rNode->kind() == PNKind::kPassThrough); NG_RETURN_IF_ERROR(collectData(passThrough, curr.root, rNode, &passThrough, &subplan)); } plan->root = subplan.root; + return Status::OK(); } -// build subplan: Project->Dedup->GetNeighbors->[Filter]->Project + +// Build subplan: Project->Dedup->GetNeighbors->[Filter]->Project Status Expand::expandStep(const EdgeInfo& edge, PlanNode* dep, const std::string& inputVar, const Expression* nodeFilter, - bool needPassThrough, SubPlan* plan) { auto qctx = matchCtx_->qctx; @@ -172,13 +199,6 @@ Status Expand::expandStep(const EdgeInfo& edge, root = Project::make(qctx, root, listColumns); root->setColNames({kPathStr}); - if (needPassThrough) { - auto pt = PassThroughNode::make(qctx, root); - pt->setColNames(root->colNames()); - pt->setOutputVar(root->outputVar()); - root = pt; - } - plan->root = root; plan->tail = curr.tail; return Status::OK(); @@ -190,6 +210,7 @@ Status Expand::collectData(const PlanNode* joinLeft, PlanNode** passThrough, SubPlan* plan) { auto qctx = matchCtx_->qctx; + // [dataJoin] auto join = SegmentsConnector::innerJoinSegments(qctx, joinLeft, joinRight); auto lpath = folly::stringPrintf("%s_%d", kPathStr, 0); auto rpath = folly::stringPrintf("%s_%d", kPathStr, 1); @@ -221,9 +242,9 @@ Status Expand::filterDatasetByPathLength(const EdgeInfo& edge, SubPlan* plan) { auto qctx = matchCtx_->qctx; - // filter rows whose edges number less than min hop + // Filter rows whose edges number less than min hop auto args = std::make_unique<ArgumentList>(); - // expr: length(relationships(p)) >= minHop + // Expr: length(relationships(p)) >= minHop auto pathExpr = ExpressionUtils::inputPropExpr(kPathStr); args->addArgument(std::move(pathExpr)); auto fn = std::make_unique<std::string>("length"); @@ -235,8 +256,16 @@ Status Expand::filterDatasetByPathLength(const EdgeInfo& edge, auto filter = Filter::make(qctx, input, saveObject(expr.release())); filter->setColNames(input->colNames()); plan->root = filter; - // plan->tail = curr.tail; + // Plan->tail = curr.tail; return Status::OK(); } + +PlanNode* Expand::passThrough(const QueryContext *qctx, const PlanNode *root) const { + auto pt = PassThroughNode::make(const_cast<QueryContext*>(qctx), const_cast<PlanNode*>(root)); + pt->setOutputVar(root->outputVar()); + pt->setColNames(root->colNames()); + return pt; +} + } // namespace graph } // namespace nebula diff --git a/src/planner/match/Expand.h b/src/planner/match/Expand.h index ba4e9cfc23bf28cf68f0d337284476101566fb45..178edd44b4b9b6469138743c3815e9780f4e8944 100644 --- a/src/planner/match/Expand.h +++ b/src/planner/match/Expand.h @@ -50,7 +50,6 @@ private: PlanNode* dep, const std::string& inputVar, const Expression* nodeFilter, - bool needPassThrough, SubPlan* plan); Status collectData(const PlanNode* joinLeft, @@ -61,6 +60,10 @@ private: Status filterDatasetByPathLength(const EdgeInfo& edge, PlanNode* input, SubPlan* plan); + // Add a passThrough node into plan so that the result of previous ndoe + // can be used by multiple other plan nodes + PlanNode* passThrough(const QueryContext *qctx, const PlanNode *root) const; + template <typename T> T* saveObject(T* obj) const { return matchCtx_->qctx->objPool()->add(obj); diff --git a/src/planner/match/MatchClausePlanner.cpp b/src/planner/match/MatchClausePlanner.cpp index 512e6d6d72e4a9c918a2d050d7009ae065067f88..d361185ae578ed083bc7b199d3e52c98f8e5b732 100644 --- a/src/planner/match/MatchClausePlanner.cpp +++ b/src/planner/match/MatchClausePlanner.cpp @@ -116,7 +116,6 @@ Status MatchClausePlanner::expandFromNode(const std::vector<NodeInfo>& nodeInfos SubPlan rightExpandPlan = subplan; NG_RETURN_IF_ERROR( rightExpandFromNode(nodeInfos, edgeInfos, matchClauseCtx, startIndex, rightExpandPlan)); - if (startIndex > 0) { auto left = rightExpandPlan.root; SubPlan leftExpandPlan = rightExpandPlan; @@ -126,6 +125,7 @@ Status MatchClausePlanner::expandFromNode(const std::vector<NodeInfo>& nodeInfos startIndex, subplan.root->outputVar(), leftExpandPlan)); + rightExpandPlan.root = leftExpandPlan.root; if (startIndex < nodeInfos.size() - 1) { // Connect the left expand and right expand part. @@ -175,16 +175,16 @@ Status MatchClausePlanner::leftExpandFromNode(const std::vector<NodeInfo>& nodeI VLOG(1) << "root: " << subplan.root->outputVar() << " tail: " << subplan.tail->outputVar(); auto left = subplan.root; - NG_RETURN_IF_ERROR( - appendFetchVertexPlan(nodeInfos.front().filter, - matchClauseCtx->space, - matchClauseCtx->qctx, - edgeInfos.empty() ? initialExpr_->clone().release() : nullptr, - subplan)); + NG_RETURN_IF_ERROR(MatchSolver::appendFetchVertexPlan( + nodeInfos.front().filter, + matchClauseCtx->space, + matchClauseCtx->qctx, + edgeInfos.empty() ? initialExpr_->clone().release() : nullptr, + subplan)); if (!edgeInfos.empty()) { auto right = subplan.root; VLOG(1) << "left: " << folly::join(",", left->colNames()) - << " right: " << folly::join(",", right->colNames()); + << " right: " << folly::join(",", right->colNames()); subplan.root = SegmentsConnector::innerJoinSegments(matchClauseCtx->qctx, left, right); joinColNames.emplace_back( folly::stringPrintf("%s_%lu", kPathStr, nodeInfos.size() + startIndex)); @@ -224,12 +224,12 @@ Status MatchClausePlanner::rightExpandFromNode(const std::vector<NodeInfo>& node VLOG(1) << "root: " << subplan.root->outputVar() << " tail: " << subplan.tail->outputVar(); auto left = subplan.root; - NG_RETURN_IF_ERROR( - appendFetchVertexPlan(nodeInfos.back().filter, - matchClauseCtx->space, - matchClauseCtx->qctx, - edgeInfos.empty() ? initialExpr_->clone().release() : nullptr, - subplan)); + NG_RETURN_IF_ERROR(MatchSolver::appendFetchVertexPlan( + nodeInfos.back().filter, + matchClauseCtx->space, + matchClauseCtx->qctx, + edgeInfos.empty() ? initialExpr_->clone().release() : nullptr, + subplan)); if (!edgeInfos.empty()) { auto right = subplan.root; VLOG(1) << "left: " << folly::join(",", left->colNames()) @@ -256,84 +256,6 @@ Status MatchClausePlanner::expandFromEdge(const std::vector<NodeInfo>& nodeInfos return Status::Error("Expand from edge has not been implemented yet."); } -Status MatchClausePlanner::appendFetchVertexPlan(const Expression* nodeFilter, - const SpaceInfo& space, - QueryContext* qctx, - Expression* initialExpr, - SubPlan& plan) { - MatchSolver::extractAndDedupVidColumn( - qctx, initialExpr, plan.root, plan.root->outputVar(), plan); - auto srcExpr = ExpressionUtils::inputPropExpr(kVid); - auto props = flattenTags(qctx, space); - NG_RETURN_IF_ERROR(props); - auto gv = GetVertices::make( - qctx, - plan.root, - space.id, - qctx->objPool()->add(srcExpr.release()), - std::move(props).value(), - {}); - - PlanNode* root = gv; - if (nodeFilter != nullptr) { - auto filter = qctx->objPool()->add(nodeFilter->clone().release()); - RewriteMatchLabelVisitor visitor( - [](const Expression* expr) -> Expression *{ - DCHECK(expr->kind() == Expression::Kind::kLabelAttribute || - expr->kind() == Expression::Kind::kLabel); - // filter prop - if (expr->kind() == Expression::Kind::kLabelAttribute) { - auto la = static_cast<const LabelAttributeExpression*>(expr); - return new AttributeExpression( - new VertexExpression(), la->right()->clone().release()); - } - // filter tag - return new VertexExpression(); - }); - filter->accept(&visitor); - root = Filter::make(qctx, root, filter); - } - - // normalize all columns to one - auto columns = qctx->objPool()->add(new YieldColumns); - auto pathExpr = std::make_unique<PathBuildExpression>(); - pathExpr->add(std::make_unique<VertexExpression>()); - columns->addColumn(new YieldColumn(pathExpr.release())); - plan.root = Project::make(qctx, root, columns); - plan.root->setColNames({kPathStr}); - return Status::OK(); -} - -StatusOr<std::vector<storage::cpp2::VertexProp>> -MatchClausePlanner::flattenTags(QueryContext *qctx, const SpaceInfo& space) { - // Get all tags in the space - const auto allTagsResult = qctx->schemaMng()->getAllLatestVerTagSchema(space.id); - NG_RETURN_IF_ERROR(allTagsResult); - // allTags: std::unordered_map<TagID, std::shared_ptr<const meta::NebulaSchemaProvider>> - const auto allTags = std::move(allTagsResult).value(); - - std::vector<storage::cpp2::VertexProp> props; - props.reserve(allTags.size()); - // Retrieve prop names of each tag and append "_tag" to the name list to query empty tags - for (const auto &tag : allTags) { - // tag: pair<TagID, std::shared_ptr<const meta::NebulaSchemaProvider>> - std::vector<std::string> propNames; - storage::cpp2::VertexProp vProp; - - const auto tagId = tag.first; - vProp.set_tag(tagId); - const auto tagSchema = tag.second; // nebulaSchemaProvider - for (size_t i=0; i < tagSchema->getNumFields(); i++) { - const auto propName = tagSchema->getFieldName(i); - propNames.emplace_back(propName); - } - propNames.emplace_back(nebula::kTag); // "_tag" - vProp.set_props(std::move(propNames)); - props.emplace_back(std::move(vProp)); - } - return props; -} - Status MatchClausePlanner::projectColumnsBySymbols(MatchClauseContext* matchClauseCtx, size_t startIndex, SubPlan& plan) { diff --git a/src/planner/match/MatchClausePlanner.h b/src/planner/match/MatchClausePlanner.h index 81b84e8eb1a3cc17164a23d8f8458762cdde4b80..69789af4152f7c03880e63179def8cde1dddb089 100644 --- a/src/planner/match/MatchClausePlanner.h +++ b/src/planner/match/MatchClausePlanner.h @@ -60,12 +60,6 @@ private: size_t startIndex, SubPlan& subplan); - Status appendFetchVertexPlan(const Expression* nodeFilter, - const SpaceInfo& space, - QueryContext* qctx, - Expression* initialExpr, - SubPlan& plan); - Status projectColumnsBySymbols(MatchClauseContext* matchClauseCtx, size_t startIndex, SubPlan& plan); @@ -80,9 +74,6 @@ private: size_t nodeInfoSize) const; Status appendFilterPlan(MatchClauseContext* matchClauseCtx, SubPlan& subplan); - // Fetch all tags in the space and retrieve props from tags - StatusOr<std::vector<storage::cpp2::VertexProp>> flattenTags(QueryContext *qctx, - const SpaceInfo& space); private: std::unique_ptr<Expression> initialExpr_; diff --git a/src/planner/match/MatchSolver.cpp b/src/planner/match/MatchSolver.cpp index d28c8a2e39c8634005c793a8b3922195e55316ce..83ef14282d991443144570d9b1059997924e7a5d 100644 --- a/src/planner/match/MatchSolver.cpp +++ b/src/planner/match/MatchSolver.cpp @@ -228,5 +228,93 @@ PlanNode* MatchSolver::filtPathHasSameEdge(PlanNode* input, return filter; } +Status MatchSolver::appendFetchVertexPlan(const Expression* nodeFilter, + const SpaceInfo& space, + QueryContext* qctx, + Expression* initialExpr, + SubPlan& plan) { + return appendFetchVertexPlan( + nodeFilter, space, qctx, initialExpr, plan.root->outputVar(), plan); +} + +Status MatchSolver::appendFetchVertexPlan(const Expression* nodeFilter, + const SpaceInfo& space, + QueryContext* qctx, + Expression* initialExpr, + std::string inputVar, + SubPlan& plan) { + // [Dedup] + extractAndDedupVidColumn(qctx, initialExpr, plan.root, inputVar, plan); + auto srcExpr = ExpressionUtils::inputPropExpr(kVid); + // [Get vertices] + auto props = flattenTags(qctx, space); + NG_RETURN_IF_ERROR(props); + auto gv = GetVertices::make(qctx, + plan.root, + space.id, + qctx->objPool()->add(srcExpr.release()), + std::move(props).value(), + {}); + + PlanNode* root = gv; + if (nodeFilter != nullptr) { + auto filter = qctx->objPool()->add(nodeFilter->clone().release()); + RewriteMatchLabelVisitor visitor( + [](const Expression* expr) -> Expression *{ + DCHECK(expr->kind() == Expression::Kind::kLabelAttribute || + expr->kind() == Expression::Kind::kLabel); + // filter prop + if (expr->kind() == Expression::Kind::kLabelAttribute) { + auto la = static_cast<const LabelAttributeExpression*>(expr); + return new AttributeExpression( + new VertexExpression(), la->right()->clone().release()); + } + // filter tag + return new VertexExpression(); + }); + filter->accept(&visitor); + root = Filter::make(qctx, root, filter); + } + // [Project] + // Normalize all columns to one + auto columns = qctx->objPool()->add(new YieldColumns); + auto pathExpr = std::make_unique<PathBuildExpression>(); + pathExpr->add(std::make_unique<VertexExpression>()); + columns->addColumn(new YieldColumn(pathExpr.release())); + plan.root = Project::make(qctx, root, columns); + plan.root->setColNames({kPathStr}); + return Status::OK(); +} + +StatusOr<std::vector<storage::cpp2::VertexProp>> MatchSolver::flattenTags(QueryContext* qctx, + const SpaceInfo& space) { + // Get all tags in the space + const auto allTagsResult = qctx->schemaMng()->getAllLatestVerTagSchema(space.id); + NG_RETURN_IF_ERROR(allTagsResult); + // allTags: std::unordered_map<TagID, std::shared_ptr<const meta::NebulaSchemaProvider>> + const auto allTags = std::move(allTagsResult).value(); + + std::vector<storage::cpp2::VertexProp> props; + props.reserve(allTags.size()); + // Retrieve prop names of each tag and append "_tag" to the name list to query empty tags + for (const auto& tag : allTags) { + // tag: pair<TagID, std::shared_ptr<const meta::NebulaSchemaProvider>> + std::vector<std::string> propNames; + storage::cpp2::VertexProp vProp; + + const auto tagId = tag.first; + vProp.set_tag(tagId); + const auto tagSchema = tag.second; // nebulaSchemaProvider + for (size_t i = 0; i < tagSchema->getNumFields(); i++) { + const auto propName = tagSchema->getFieldName(i); + propNames.emplace_back(propName); + } + propNames.emplace_back(nebula::kTag); // "_tag" + vProp.set_props(std::move(propNames)); + props.emplace_back(std::move(vProp)); + } + return props; +} + } // namespace graph } // namespace nebula diff --git a/src/planner/match/MatchSolver.h b/src/planner/match/MatchSolver.h index ddce44c342d3b99413aabcdd75117d1dcad7e9f0..db068a138341994fa97485ea3baa7e79abcacf2f 100644 --- a/src/planner/match/MatchSolver.h +++ b/src/planner/match/MatchSolver.h @@ -60,7 +60,27 @@ public: static PlanNode* filtPathHasSameEdge(PlanNode* input, const std::string& column, QueryContext* qctx); + + static Status appendFetchVertexPlan(const Expression* nodeFilter, + const SpaceInfo& space, + QueryContext* qctx, + Expression* initialExpr, + SubPlan& plan); + + // In 0 step left expansion case, the result of initial index scan + // will be passed as inputVar after right expansion is finished + static Status appendFetchVertexPlan(const Expression* nodeFilter, + const SpaceInfo& space, + QueryContext* qctx, + Expression* initialExpr, + std::string inputVar, + SubPlan& plan); + + // Fetch all tags in the space and retrieve props from tags + static StatusOr<std::vector<storage::cpp2::VertexProp>> flattenTags(QueryContext* qctx, + const SpaceInfo& space); }; + } // namespace graph } // namespace nebula #endif // PLANNER_MATCHSOLVER_H_ diff --git a/src/planner/match/VertexIdSeek.cpp b/src/planner/match/VertexIdSeek.cpp index 8774a48570b01b6502ba64ba6fca0eb8f8bc26c9..4338ec9b9444244e0e95ade1f7b7097d5647cf3d 100644 --- a/src/planner/match/VertexIdSeek.cpp +++ b/src/planner/match/VertexIdSeek.cpp @@ -117,8 +117,8 @@ StatusOr<SubPlan> VertexIdSeek::transformNode(NodeContext* nodeCtx) { } auto* passThrough = PassThroughNode::make(qctx, nullptr); - passThrough->setColNames({kVid}); passThrough->setOutputVar(vidsResult.first); + passThrough->setColNames({kVid}); plan.root = passThrough; plan.tail = passThrough; diff --git a/src/validator/MatchValidator.cpp b/src/validator/MatchValidator.cpp index 20e9f0414b817fdf9b49384a729862e0eb2edbd2..d392ce323782ea59806429c09118aa57d442a4a5 100644 --- a/src/validator/MatchValidator.cpp +++ b/src/validator/MatchValidator.cpp @@ -425,10 +425,11 @@ Status MatchValidator::validateStepRange(const MatchStepRange *range) const { "Max hop must be greater equal than min hop: %ld vs. %ld", max, min); } if (max == std::numeric_limits<int64_t>::max()) { - return Status::SemanticError("Not set maximum hop for variable length relationships"); + return Status::SemanticError("Cannot set maximum hop for variable length relationships"); } if (min < 0) { - return Status::SemanticError("Negtive steps are invalid"); + return Status::SemanticError( + "Cannot set negtive steps minumum hop for variable length relationships"); } return Status::OK(); } diff --git a/tests/tck/features/bugfix/MatchReturnEmptyTag.feature b/tests/tck/features/bugfix/MatchReturnEmptyTag.feature index 6fa66f1869410e4c6501cb4cf71c824450ebff5d..b1052d6f436b589f37b2da8936abc32ef632943d 100644 --- a/tests/tck/features/bugfix/MatchReturnEmptyTag.feature +++ b/tests/tck/features/bugfix/MatchReturnEmptyTag.feature @@ -2,6 +2,7 @@ # # This source code is licensed under Apache 2.0 License, # attached with Common Clause Condition 1.0, found in the LICENSES directory. +@test Feature: Fix match losing undefined vertex tag info Examples: | space | vid | diff --git a/tests/tck/features/match/Base.IntVid.feature b/tests/tck/features/match/Base.IntVid.feature index c680a9dd33e48d18fc03138937098b174143d61e..958516d799a28461db70b1ea10b05ddbf73bef30 100644 --- a/tests/tck/features/match/Base.IntVid.feature +++ b/tests/tck/features/match/Base.IntVid.feature @@ -300,7 +300,7 @@ Feature: Basic match """ Then a SemanticError should be raised at runtime: Only column name can be used as sort item - Scenario: Oeturn path + Scenario: Return path When executing query: """ MATCH p = (n:player{name:"Tony Parker"}) return p,n diff --git a/tests/tck/features/match/Base.feature b/tests/tck/features/match/Base.feature index 32fc42e61776b9705d16ac8d7f84fd5512826cb1..619b8841809870d10accc5f3bf4f0e59f56edc20 100644 --- a/tests/tck/features/match/Base.feature +++ b/tests/tck/features/match/Base.feature @@ -300,7 +300,7 @@ Feature: Basic match """ Then a SemanticError should be raised at runtime: Only column name can be used as sort item - Scenario: Oeturn path + Scenario: Return path When executing query: """ MATCH p = (n:player{name:"Tony Parker"}) return p,n diff --git a/tests/tck/features/match/ZeroStep.feature b/tests/tck/features/match/ZeroStep.feature new file mode 100644 index 0000000000000000000000000000000000000000..2f50856c0a46695987f18d9f64c21bf65cbe4f83 --- /dev/null +++ b/tests/tck/features/match/ZeroStep.feature @@ -0,0 +1,457 @@ +# Copyright (c) 2020 vesoft inc. All rights reserved. +# +# This source code is licensed under Apache 2.0 License, +# attached with Common Clause Condition 1.0, found in the LICENSES directory. +Feature: Variable length Pattern match (0 step) + + Background: + Given a graph with space named "nba" + + Scenario Outline: Use step all-direction edge with properties 0 step, return node + When executing query: + """ + MATCH <left_node><edge_dir_left><edge><edge_dir_right><right_node> + RETURN v + """ + Then the result should be, in any order: + | v | + | ("Tim Duncan":bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + + Examples: + | left_node | edge_dir_left | edge | edge_dir_right | right_node | + | (v :player {name: "Tim Duncan"}) | - | [*0] | - | () | + | (v :player {name: "Tim Duncan"}) | <- | [*0] | - | () | + | (v :player {name: "Tim Duncan"}) | - | [*0] | -> | () | + | () | - | [*0] | - | (v :player {name: "Tim Duncan"}) | + | () | <- | [*0] | - | (v :player {name: "Tim Duncan"}) | + | () | - | [*0] | -> | (v :player {name: "Tim Duncan"}) | + + # match (v :player {name: "Tim Duncan"})-[e :like*0..1]-() return e + Scenario Outline: Use step all-direction edge without properties 0 to 1 step, return edge + When executing query: + """ + MATCH <left_node><edge_dir_left><edge><edge_dir_right><right_node> + RETURN e + """ + Then the result should be, in any order: + | e | + | [[:like "Aron Baynes"->"Tim Duncan" @0 {likeness: 80}]] | + | [[:like "Boris Diaw"->"Tim Duncan" @0 {likeness: 80}]] | + | [[:like "Danny Green"->"Tim Duncan" @0 {likeness: 70}]] | + | [[:like "Dejounte Murray"->"Tim Duncan" @0 {likeness: 99}]] | + | [[:like "LaMarcus Aldridge"->"Tim Duncan" @0 {likeness: 75}]] | + | [[:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | + | [[:like "Marco Belinelli"->"Tim Duncan" @0 {likeness: 55}]] | + | [[:like "Shaquile O'Neal"->"Tim Duncan" @0 {likeness: 80}]] | + | [[:like "Tiago Splitter"->"Tim Duncan" @0 {likeness: 80}]] | + | [[:like "Tony Parker"->"Tim Duncan" @0 {likeness: 95}]] | + | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}]] | + | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}]] | + | [] | + When executing query: + """ + MATCH (:player{name:"Tim Duncan"})-[e:serve*0..1]-(v) + RETURN e, v + """ + Then the result should be, in any order: + | e | v | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + + Examples: + | left_node | edge_dir_left | edge | edge_dir_right | right_node | + | (v :player {name: "Tim Duncan"}) | - | [e :like*0..1] | - | () | + | () | - | [e :like*0..1] | - | (v :player {name: "Tim Duncan"}) | + + # match (v :player {name: "Tim Duncan"})-[e :like*0..1{likeness: 90}]->() return e + Scenario Outline: Use step one-direction edge with properties 0 to 1 step, return edge + When executing query: + """ + MATCH <left_node><edge_dir_left><edge><edge_dir_right><right_node> + RETURN e + """ + Then the result should be, in any order: + | e | + | [[:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | + | [] | + + Examples: + | left_node | edge_dir_left | edge | edge_dir_right | right_node | + | (v :player {name: "Tim Duncan"}) | <- | [e :like*0..1{likeness: 90}] | - | () | + | () | - | [e :like*0..1{likeness: 90}] | -> | (v :player {name: "Tim Duncan"}) | + + Scenario: Edge without properties 0 to n step, return edge and dst + When executing query: + """ + MATCH (:player{name:"Tim Duncan"})-[e:serve*0..2]-(v) + RETURN e, v + """ + Then the result should be, in any order: + | e | v | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Aron Baynes"->"Spurs" @0 {end_year: 2015, start_year: 2013}]] | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Boris Diaw"->"Spurs" @0 {end_year: 2016, start_year: 2012}]] | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Cory Joseph"->"Spurs" @0 {end_year: 2015, start_year: 2011}]] | ("Cory Joseph" :player{age: 27, name: "Cory Joseph"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Danny Green"->"Spurs" @0 {end_year: 2018, start_year: 2010}]] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "David West"->"Spurs" @0 {end_year: 2016, start_year: 2015}]] | ("David West" :player{age: 38, name: "David West"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Dejounte Murray"->"Spurs" @0 {end_year: 2019, start_year: 2016}]] | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Jonathon Simmons"->"Spurs" @0 {end_year: 2017, start_year: 2015}]] | ("Jonathon Simmons" :player{age: 29, name: "Jonathon Simmons"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Kyle Anderson"->"Spurs" @0 {end_year: 2018, start_year: 2014}]] | ("Kyle Anderson" :player{age: 25, name: "Kyle Anderson"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "LaMarcus Aldridge"->"Spurs" @0 {end_year: 2019, start_year: 2015}]] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Manu Ginobili"->"Spurs" @0 {end_year: 2018, start_year: 2002}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Marco Belinelli"->"Spurs" @0 {end_year: 2015, start_year: 2013}]] | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Paul Gasol"->"Spurs" @0 {end_year: 2019, start_year: 2016}]] | ("Paul Gasol" :player{age: 38, name: "Paul Gasol"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Rudy Gay"->"Spurs" @0 {end_year: 2019, start_year: 2017}]] | ("Rudy Gay" :player{age: 32, name: "Rudy Gay"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Tiago Splitter"->"Spurs" @0 {end_year: 2015, start_year: 2010}]] | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Marco Belinelli"->"Spurs" @1 {end_year: 2019, start_year: 2018}]] | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Tony Parker"->"Spurs" @0 {end_year: 2018, start_year: 1999}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Tracy McGrady"->"Spurs" @0 {end_year: 2013, start_year: 2013}]] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + + Scenario: Multiple variable length with edge filter + When executing query: + """ + MATCH (:player{name:"Tim Duncan"})-[e:serve*0..2]-(v)-[e2 :like*0..2{likeness:90}]-(v2) + RETURN e2, v2 + """ + Then the result should be, in any order: + | e2 | v2 | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}], [:like "Grant Hill"->"Tracy McGrady" @0 {likeness: 90}]] | ("Grant Hill" :player{age: 46, name: "Grant Hill"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}], [:like "Vince Carter"->"Tracy McGrady" @0 {likeness: 90}]] | ("Vince Carter" :player{age: 42, name: "Vince Carter"}) | + | [[:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}], [:like "Tiago Splitter"->"Manu Ginobili" @0 {likeness: 90}]] | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | + | [[:like "Yao Ming"->"Tracy McGrady" @0 {likeness: 90}], [:like "Yao Ming"->"Shaquile O'Neal" @0 {likeness: 90}]] | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | + | [[:like "Tracy McGrady"->"Grant Hill" @0 {likeness: 90}], [:like "Grant Hill"->"Tracy McGrady" @0 {likeness: 90}]] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}], [:like "Yao Ming"->"Tracy McGrady" @0 {likeness: 90}]] | ("Yao Ming" :player{age: 38, name: "Yao Ming"}) | + | [[:like "Tiago Splitter"->"Manu Ginobili" @0 {likeness: 90}], [:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}], [:like "Tracy McGrady"->"Grant Hill" @0 {likeness: 90}]] | ("Grant Hill" :player{age: 46, name: "Grant Hill"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}], [:like "Tracy McGrady"->"Kobe Bryant" @0 {likeness: 90}]] | ("Kobe Bryant" :player{age: 40, name: "Kobe Bryant"}) | + | [[:like "Paul Gasol"->"Kobe Bryant" @0 {likeness: 90}], [:like "Tracy McGrady"->"Kobe Bryant" @0 {likeness: 90}]] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [[:like "Grant Hill"->"Tracy McGrady" @0 {likeness: 90}], [:like "Tracy McGrady"->"Grant Hill" @0 {likeness: 90}]] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [[:like "Tracy McGrady"->"Kobe Bryant" @0 {likeness: 90}], [:like "Paul Gasol"->"Kobe Bryant" @0 {likeness: 90}]] | ("Paul Gasol" :player{age: 38, name: "Paul Gasol"}) | + | [[:like "Paul Gasol"->"Kobe Bryant" @0 {likeness: 90}]] | ("Kobe Bryant" :player{age: 40, name: "Kobe Bryant"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [[:like "Tiago Splitter"->"Manu Ginobili" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tiago Splitter"->"Manu Ginobili" @0 {likeness: 90}]] | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}]] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [[:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}]] | ("Rudy Gay" :player{age: 32, name: "Rudy Gay"}) | + | [[:like "Tracy McGrady"->"Kobe Bryant" @0 {likeness: 90}]] | ("Kobe Bryant" :player{age: 40, name: "Kobe Bryant"}) | + | [[:like "Tracy McGrady"->"Grant Hill" @0 {likeness: 90}]] | ("Grant Hill" :player{age: 46, name: "Grant Hill"}) | + | [[:like "Yao Ming"->"Tracy McGrady" @0 {likeness: 90}]] | ("Yao Ming" :player{age: 38, name: "Yao Ming"}) | + | [[:like "Vince Carter"->"Tracy McGrady" @0 {likeness: 90}]] | ("Vince Carter" :player{age: 42, name: "Vince Carter"}) | + | [[:like "Grant Hill"->"Tracy McGrady" @0 {likeness: 90}]] | ("Grant Hill" :player{age: 46, name: "Grant Hill"}) | + | [] | ("Paul Gasol" :player{age: 38, name: "Paul Gasol"}) | + | [] | ("Cory Joseph" :player{age: 27, name: "Cory Joseph"}) | + | [] | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | + | [] | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | + | [] | ("David West" :player{age: 38, name: "David West"}) | + | [] | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | + | [] | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | + | [] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [] | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | + | [] | ("Kyle Anderson" :player{age: 25, name: "Kyle Anderson"}) | + | [] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Rudy Gay" :player{age: 32, name: "Rudy Gay"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [] | ("Jonathon Simmons" :player{age: 29, name: "Jonathon Simmons"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + When executing query: + """ + MATCH (v) -[*0..1]-(v2:player{name: "Tim Duncan"})-[*0..1]->() + RETURN v, v2 + """ + Then the result should be, in any order: + | v | v2 | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + When executing query: + """ + MATCH (v) -[*0..1]-(v2:player{name: "Tim Duncan"})-[e*1..2]->(v3) + RETURN DISTINCT v3.name AS Name, e ORDER BY Name + """ + Then the result should be, in any order: + | Name | e | + | "Cavaliers" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:serve "Danny Green"->"Cavaliers" @0 {end_year: 2010, start_year: 2009}]] | + | "Danny Green" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}]] | + | "Hornets" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:serve "Tony Parker"->"Hornets" @0 {end_year: 2019, start_year: 2018}]] | + | "Hornets" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:serve "Tony Parker"->"Hornets" @0 {end_year: 2019, start_year: 2018}]] | + | "Kyle Anderson" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:teammate "Tony Parker"->"Kyle Anderson" @0 {end_year: 2016, start_year: 2014}]] | + | "Kyle Anderson" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:teammate "Tony Parker"->"Kyle Anderson" @0 {end_year: 2016, start_year: 2014}]] | + | "LaMarcus Aldridge" | [[:teammate "Tim Duncan"->"LaMarcus Aldridge" @0 {end_year: 2016, start_year: 2015}]] | + | "LaMarcus Aldridge" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:teammate "Tony Parker"->"LaMarcus Aldridge" @0 {end_year: 2018, start_year: 2015}]] | + | "LaMarcus Aldridge" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:teammate "Tony Parker"->"LaMarcus Aldridge" @0 {end_year: 2018, start_year: 2015}]] | + | "LaMarcus Aldridge" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | + | "LaMarcus Aldridge" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | + | "LeBron James" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:like "Danny Green"->"LeBron James" @0 {likeness: 80}]] | + | "Manu Ginobili" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:teammate "Tony Parker"->"Manu Ginobili" @0 {end_year: 2018, start_year: 2002}]] | + | "Manu Ginobili" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:like "Tony Parker"->"Manu Ginobili" @0 {likeness: 95}]] | + | "Manu Ginobili" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:like "Tony Parker"->"Manu Ginobili" @0 {likeness: 95}]] | + | "Manu Ginobili" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:teammate "Tony Parker"->"Manu Ginobili" @0 {end_year: 2018, start_year: 2002}]] | + | "Manu Ginobili" | [[:teammate "Tim Duncan"->"Manu Ginobili" @0 {end_year: 2016, start_year: 2002}]] | + | "Manu Ginobili" | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}]] | + | "Marco Belinelli" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:like "Danny Green"->"Marco Belinelli" @0 {likeness: 83}]] | + | "Raptors" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:serve "Danny Green"->"Raptors" @0 {end_year: 2019, start_year: 2018}]] | + | "Spurs" | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}], [:serve "Manu Ginobili"->"Spurs" @0 {end_year: 2018, start_year: 2002}]] | + | "Spurs" | [[:teammate "Tim Duncan"->"Manu Ginobili" @0 {end_year: 2016, start_year: 2002}], [:serve "Manu Ginobili"->"Spurs" @0 {end_year: 2018, start_year: 2002}]] | + | "Spurs" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:serve "Tony Parker"->"Spurs" @0 {end_year: 2018, start_year: 1999}]] | + | "Spurs" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:serve "Tony Parker"->"Spurs" @0 {end_year: 2018, start_year: 1999}]] | + | "Spurs" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:serve "Danny Green"->"Spurs" @0 {end_year: 2018, start_year: 2010}]] | + | "Spurs" | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}]] | + | "Spurs" | [[:teammate "Tim Duncan"->"LaMarcus Aldridge" @0 {end_year: 2016, start_year: 2015}], [:serve "LaMarcus Aldridge"->"Spurs" @0 {end_year: 2019, start_year: 2015}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:like "Danny Green"->"Tim Duncan" @0 {likeness: 70}]] | + | "Tim Duncan" | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}], [:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"Manu Ginobili" @0 {end_year: 2016, start_year: 2002}], [:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:teammate "Tony Parker"->"Tim Duncan" @0 {end_year: 2016, start_year: 2001}]] | + | "Tim Duncan" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:teammate "Tony Parker"->"Tim Duncan" @0 {end_year: 2016, start_year: 2001}]] | + | "Tim Duncan" | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}], [:teammate "Manu Ginobili"->"Tim Duncan" @0 {end_year: 2016, start_year: 2002}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:like "Tony Parker"->"Tim Duncan" @0 {likeness: 95}]] | + | "Tim Duncan" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:like "Tony Parker"->"Tim Duncan" @0 {likeness: 95}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"Manu Ginobili" @0 {end_year: 2016, start_year: 2002}], [:teammate "Manu Ginobili"->"Tim Duncan" @0 {end_year: 2016, start_year: 2002}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"LaMarcus Aldridge" @0 {end_year: 2016, start_year: 2015}], [:like "LaMarcus Aldridge"->"Tim Duncan" @0 {likeness: 75}]] | + | "Tony Parker" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}]] | + | "Tony Parker" | [[:teammate "Tim Duncan"->"LaMarcus Aldridge" @0 {end_year: 2016, start_year: 2015}], [:like "LaMarcus Aldridge"->"Tony Parker" @0 {likeness: 75}]] | + | "Tony Parker" | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}], [:teammate "Manu Ginobili"->"Tony Parker" @0 {end_year: 2016, start_year: 2002}]] | + | "Tony Parker" | [[:teammate "Tim Duncan"->"Manu Ginobili" @0 {end_year: 2016, start_year: 2002}], [:teammate "Manu Ginobili"->"Tony Parker" @0 {end_year: 2016, start_year: 2002}]] | + | "Tony Parker" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}]] | + | "Trail Blazers" | [[:teammate "Tim Duncan"->"LaMarcus Aldridge" @0 {end_year: 2016, start_year: 2015}], [:serve "LaMarcus Aldridge"->"Trail Blazers" @0 {end_year: 2015, start_year: 2006}]] | + When executing query: + """ + MATCH (v) -[e1*0..1{likeness: 90}]-(v2:player{name: "Tony Parker"})-[*1..2]->(v3) + RETURN e1, v3 as Player ORDER BY Player + """ + Then the result should be, in any order: + | e1 | Player | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [] | ("Grizzlies" :team{name: "Grizzlies"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Grizzlies" :team{name: "Grizzlies"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Hornets" :team{name: "Hornets"}) | + | [] | ("Hornets" :team{name: "Hornets"}) | + | [] | ("Kyle Anderson" :player{age: 25, name: "Kyle Anderson"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Kyle Anderson" :player{age: 25, name: "Kyle Anderson"}) | + | [] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Trail Blazers" :team{name: "Trail Blazers"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Trail Blazers" :team{name: "Trail Blazers"}) | + | [] | ("Trail Blazers" :team{name: "Trail Blazers"}) | diff --git a/tests/tck/features/match/ZeroStep.intVid.feature b/tests/tck/features/match/ZeroStep.intVid.feature new file mode 100644 index 0000000000000000000000000000000000000000..76dd21d3271843fc37a334a9f0a782a531f5d7cf --- /dev/null +++ b/tests/tck/features/match/ZeroStep.intVid.feature @@ -0,0 +1,457 @@ +# Copyright (c) 2020 vesoft inc. All rights reserved. +# +# This source code is licensed under Apache 2.0 License, +# attached with Common Clause Condition 1.0, found in the LICENSES directory. +Feature: Variable length Pattern match int vid (0 step) + + Background: + Given a graph with space named "nba_int_vid" + + Scenario Outline: Use step all-direction edge with properties 0 step, return node + When executing query: + """ + MATCH <left_node><edge_dir_left><edge><edge_dir_right><right_node> + RETURN v + """ + Then the result should be, in any order: + | v | + | ("Tim Duncan":bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + + Examples: + | left_node | edge_dir_left | edge | edge_dir_right | right_node | + | (v :player {name: "Tim Duncan"}) | - | [*0] | - | () | + | (v :player {name: "Tim Duncan"}) | <- | [*0] | - | () | + | (v :player {name: "Tim Duncan"}) | - | [*0] | -> | () | + | () | - | [*0] | - | (v :player {name: "Tim Duncan"}) | + | () | <- | [*0] | - | (v :player {name: "Tim Duncan"}) | + | () | - | [*0] | -> | (v :player {name: "Tim Duncan"}) | + + # match (v :player {name: "Tim Duncan"})-[e :like*0..1]-() return e + Scenario Outline: Use step all-direction edge without properties 0 to 1 step, return edge + When executing query: + """ + MATCH <left_node><edge_dir_left><edge><edge_dir_right><right_node> + RETURN e + """ + Then the result should be, in any order: + | e | + | [[:like "Aron Baynes"->"Tim Duncan" @0 {likeness: 80}]] | + | [[:like "Boris Diaw"->"Tim Duncan" @0 {likeness: 80}]] | + | [[:like "Danny Green"->"Tim Duncan" @0 {likeness: 70}]] | + | [[:like "Dejounte Murray"->"Tim Duncan" @0 {likeness: 99}]] | + | [[:like "LaMarcus Aldridge"->"Tim Duncan" @0 {likeness: 75}]] | + | [[:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | + | [[:like "Marco Belinelli"->"Tim Duncan" @0 {likeness: 55}]] | + | [[:like "Shaquile O'Neal"->"Tim Duncan" @0 {likeness: 80}]] | + | [[:like "Tiago Splitter"->"Tim Duncan" @0 {likeness: 80}]] | + | [[:like "Tony Parker"->"Tim Duncan" @0 {likeness: 95}]] | + | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}]] | + | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}]] | + | [] | + When executing query: + """ + MATCH (:player{name:"Tim Duncan"})-[e:serve*0..1]-(v) + RETURN e, v + """ + Then the result should be, in any order: + | e | v | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + + Examples: + | left_node | edge_dir_left | edge | edge_dir_right | right_node | + | (v :player {name: "Tim Duncan"}) | - | [e :like*0..1] | - | () | + | () | - | [e :like*0..1] | - | (v :player {name: "Tim Duncan"}) | + + # match (v :player {name: "Tim Duncan"})-[e :like*0..1{likeness: 90}]->() return e + Scenario Outline: Use step one-direction edge with properties 0 to 1 step, return edge + When executing query: + """ + MATCH <left_node><edge_dir_left><edge><edge_dir_right><right_node> + RETURN e + """ + Then the result should be, in any order: + | e | + | [[:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | + | [] | + + Examples: + | left_node | edge_dir_left | edge | edge_dir_right | right_node | + | (v :player {name: "Tim Duncan"}) | <- | [e :like*0..1{likeness: 90}] | - | () | + | () | - | [e :like*0..1{likeness: 90}] | -> | (v :player {name: "Tim Duncan"}) | + + Scenario: Edge without properties 0 to n step, return edge and dst + When executing query: + """ + MATCH (:player{name:"Tim Duncan"})-[e:serve*0..2]-(v) + RETURN e, v + """ + Then the result should be, in any order: + | e | v | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Aron Baynes"->"Spurs" @0 {end_year: 2015, start_year: 2013}]] | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Boris Diaw"->"Spurs" @0 {end_year: 2016, start_year: 2012}]] | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Cory Joseph"->"Spurs" @0 {end_year: 2015, start_year: 2011}]] | ("Cory Joseph" :player{age: 27, name: "Cory Joseph"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Danny Green"->"Spurs" @0 {end_year: 2018, start_year: 2010}]] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "David West"->"Spurs" @0 {end_year: 2016, start_year: 2015}]] | ("David West" :player{age: 38, name: "David West"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Dejounte Murray"->"Spurs" @0 {end_year: 2019, start_year: 2016}]] | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Jonathon Simmons"->"Spurs" @0 {end_year: 2017, start_year: 2015}]] | ("Jonathon Simmons" :player{age: 29, name: "Jonathon Simmons"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Kyle Anderson"->"Spurs" @0 {end_year: 2018, start_year: 2014}]] | ("Kyle Anderson" :player{age: 25, name: "Kyle Anderson"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "LaMarcus Aldridge"->"Spurs" @0 {end_year: 2019, start_year: 2015}]] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Manu Ginobili"->"Spurs" @0 {end_year: 2018, start_year: 2002}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Marco Belinelli"->"Spurs" @0 {end_year: 2015, start_year: 2013}]] | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Paul Gasol"->"Spurs" @0 {end_year: 2019, start_year: 2016}]] | ("Paul Gasol" :player{age: 38, name: "Paul Gasol"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Rudy Gay"->"Spurs" @0 {end_year: 2019, start_year: 2017}]] | ("Rudy Gay" :player{age: 32, name: "Rudy Gay"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Tiago Splitter"->"Spurs" @0 {end_year: 2015, start_year: 2010}]] | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Marco Belinelli"->"Spurs" @1 {end_year: 2019, start_year: 2018}]] | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Tony Parker"->"Spurs" @0 {end_year: 2018, start_year: 1999}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}], [:serve "Tracy McGrady"->"Spurs" @0 {end_year: 2013, start_year: 2013}]] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + + Scenario: Multiple variable length with edge filter + When executing query: + """ + MATCH (:player{name:"Tim Duncan"})-[e:serve*0..2]-(v)-[e2 :like*0..2{likeness:90}]-(v2) + RETURN e2, v2 + """ + Then the result should be, in any order: + | e2 | v2 | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}], [:like "Grant Hill"->"Tracy McGrady" @0 {likeness: 90}]] | ("Grant Hill" :player{age: 46, name: "Grant Hill"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}], [:like "Vince Carter"->"Tracy McGrady" @0 {likeness: 90}]] | ("Vince Carter" :player{age: 42, name: "Vince Carter"}) | + | [[:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}], [:like "Tiago Splitter"->"Manu Ginobili" @0 {likeness: 90}]] | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | + | [[:like "Yao Ming"->"Tracy McGrady" @0 {likeness: 90}], [:like "Yao Ming"->"Shaquile O'Neal" @0 {likeness: 90}]] | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | + | [[:like "Tracy McGrady"->"Grant Hill" @0 {likeness: 90}], [:like "Grant Hill"->"Tracy McGrady" @0 {likeness: 90}]] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}], [:like "Yao Ming"->"Tracy McGrady" @0 {likeness: 90}]] | ("Yao Ming" :player{age: 38, name: "Yao Ming"}) | + | [[:like "Tiago Splitter"->"Manu Ginobili" @0 {likeness: 90}], [:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}], [:like "Tracy McGrady"->"Grant Hill" @0 {likeness: 90}]] | ("Grant Hill" :player{age: 46, name: "Grant Hill"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}], [:like "Tracy McGrady"->"Kobe Bryant" @0 {likeness: 90}]] | ("Kobe Bryant" :player{age: 40, name: "Kobe Bryant"}) | + | [[:like "Paul Gasol"->"Kobe Bryant" @0 {likeness: 90}], [:like "Tracy McGrady"->"Kobe Bryant" @0 {likeness: 90}]] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [[:like "Grant Hill"->"Tracy McGrady" @0 {likeness: 90}], [:like "Tracy McGrady"->"Grant Hill" @0 {likeness: 90}]] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [[:like "Tracy McGrady"->"Kobe Bryant" @0 {likeness: 90}], [:like "Paul Gasol"->"Kobe Bryant" @0 {likeness: 90}]] | ("Paul Gasol" :player{age: 38, name: "Paul Gasol"}) | + | [[:like "Paul Gasol"->"Kobe Bryant" @0 {likeness: 90}]] | ("Kobe Bryant" :player{age: 40, name: "Kobe Bryant"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [[:like "Tiago Splitter"->"Manu Ginobili" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tiago Splitter"->"Manu Ginobili" @0 {likeness: 90}]] | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}]] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [[:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tracy McGrady"->"Rudy Gay" @0 {likeness: 90}]] | ("Rudy Gay" :player{age: 32, name: "Rudy Gay"}) | + | [[:like "Tracy McGrady"->"Kobe Bryant" @0 {likeness: 90}]] | ("Kobe Bryant" :player{age: 40, name: "Kobe Bryant"}) | + | [[:like "Tracy McGrady"->"Grant Hill" @0 {likeness: 90}]] | ("Grant Hill" :player{age: 46, name: "Grant Hill"}) | + | [[:like "Yao Ming"->"Tracy McGrady" @0 {likeness: 90}]] | ("Yao Ming" :player{age: 38, name: "Yao Ming"}) | + | [[:like "Vince Carter"->"Tracy McGrady" @0 {likeness: 90}]] | ("Vince Carter" :player{age: 42, name: "Vince Carter"}) | + | [[:like "Grant Hill"->"Tracy McGrady" @0 {likeness: 90}]] | ("Grant Hill" :player{age: 46, name: "Grant Hill"}) | + | [] | ("Paul Gasol" :player{age: 38, name: "Paul Gasol"}) | + | [] | ("Cory Joseph" :player{age: 27, name: "Cory Joseph"}) | + | [] | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | + | [] | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | + | [] | ("David West" :player{age: 38, name: "David West"}) | + | [] | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | + | [] | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | + | [] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [] | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | + | [] | ("Kyle Anderson" :player{age: 25, name: "Kyle Anderson"}) | + | [] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Rudy Gay" :player{age: 32, name: "Rudy Gay"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tracy McGrady" :player{age: 39, name: "Tracy McGrady"}) | + | [] | ("Jonathon Simmons" :player{age: 29, name: "Jonathon Simmons"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + When executing query: + """ + MATCH (v) -[*0..1]-(v2:player{name: "Tim Duncan"})-[*0..1]->() + RETURN v, v2 + """ + Then the result should be, in any order: + | v | v2 | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Danny Green" :player{age: 31, name: "Danny Green"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Shaquile O'Neal" :player{age: 47, name: "Shaquile O'Neal"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Spurs" :team{name: "Spurs"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + When executing query: + """ + MATCH (v) -[*0..1]-(v2:player{name: "Tim Duncan"})-[e*1..2]->(v3) + RETURN DISTINCT v3.name AS Name, e ORDER BY Name + """ + Then the result should be, in any order: + | Name | e | + | "Cavaliers" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:serve "Danny Green"->"Cavaliers" @0 {end_year: 2010, start_year: 2009}]] | + | "Danny Green" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}]] | + | "Hornets" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:serve "Tony Parker"->"Hornets" @0 {end_year: 2019, start_year: 2018}]] | + | "Hornets" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:serve "Tony Parker"->"Hornets" @0 {end_year: 2019, start_year: 2018}]] | + | "Kyle Anderson" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:teammate "Tony Parker"->"Kyle Anderson" @0 {end_year: 2016, start_year: 2014}]] | + | "Kyle Anderson" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:teammate "Tony Parker"->"Kyle Anderson" @0 {end_year: 2016, start_year: 2014}]] | + | "LaMarcus Aldridge" | [[:teammate "Tim Duncan"->"LaMarcus Aldridge" @0 {end_year: 2016, start_year: 2015}]] | + | "LaMarcus Aldridge" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:teammate "Tony Parker"->"LaMarcus Aldridge" @0 {end_year: 2018, start_year: 2015}]] | + | "LaMarcus Aldridge" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:teammate "Tony Parker"->"LaMarcus Aldridge" @0 {end_year: 2018, start_year: 2015}]] | + | "LaMarcus Aldridge" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | + | "LaMarcus Aldridge" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | + | "LeBron James" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:like "Danny Green"->"LeBron James" @0 {likeness: 80}]] | + | "Manu Ginobili" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:teammate "Tony Parker"->"Manu Ginobili" @0 {end_year: 2018, start_year: 2002}]] | + | "Manu Ginobili" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:like "Tony Parker"->"Manu Ginobili" @0 {likeness: 95}]] | + | "Manu Ginobili" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:like "Tony Parker"->"Manu Ginobili" @0 {likeness: 95}]] | + | "Manu Ginobili" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:teammate "Tony Parker"->"Manu Ginobili" @0 {end_year: 2018, start_year: 2002}]] | + | "Manu Ginobili" | [[:teammate "Tim Duncan"->"Manu Ginobili" @0 {end_year: 2016, start_year: 2002}]] | + | "Manu Ginobili" | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}]] | + | "Marco Belinelli" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:like "Danny Green"->"Marco Belinelli" @0 {likeness: 83}]] | + | "Raptors" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:serve "Danny Green"->"Raptors" @0 {end_year: 2019, start_year: 2018}]] | + | "Spurs" | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}], [:serve "Manu Ginobili"->"Spurs" @0 {end_year: 2018, start_year: 2002}]] | + | "Spurs" | [[:teammate "Tim Duncan"->"Manu Ginobili" @0 {end_year: 2016, start_year: 2002}], [:serve "Manu Ginobili"->"Spurs" @0 {end_year: 2018, start_year: 2002}]] | + | "Spurs" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:serve "Tony Parker"->"Spurs" @0 {end_year: 2018, start_year: 1999}]] | + | "Spurs" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:serve "Tony Parker"->"Spurs" @0 {end_year: 2018, start_year: 1999}]] | + | "Spurs" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:serve "Danny Green"->"Spurs" @0 {end_year: 2018, start_year: 2010}]] | + | "Spurs" | [[:serve "Tim Duncan"->"Spurs" @0 {end_year: 2016, start_year: 1997}]] | + | "Spurs" | [[:teammate "Tim Duncan"->"LaMarcus Aldridge" @0 {end_year: 2016, start_year: 2015}], [:serve "LaMarcus Aldridge"->"Spurs" @0 {end_year: 2019, start_year: 2015}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"Danny Green" @0 {end_year: 2016, start_year: 2010}], [:like "Danny Green"->"Tim Duncan" @0 {likeness: 70}]] | + | "Tim Duncan" | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}], [:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"Manu Ginobili" @0 {end_year: 2016, start_year: 2002}], [:like "Manu Ginobili"->"Tim Duncan" @0 {likeness: 90}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:teammate "Tony Parker"->"Tim Duncan" @0 {end_year: 2016, start_year: 2001}]] | + | "Tim Duncan" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:teammate "Tony Parker"->"Tim Duncan" @0 {end_year: 2016, start_year: 2001}]] | + | "Tim Duncan" | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}], [:teammate "Manu Ginobili"->"Tim Duncan" @0 {end_year: 2016, start_year: 2002}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}], [:like "Tony Parker"->"Tim Duncan" @0 {likeness: 95}]] | + | "Tim Duncan" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}], [:like "Tony Parker"->"Tim Duncan" @0 {likeness: 95}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"Manu Ginobili" @0 {end_year: 2016, start_year: 2002}], [:teammate "Manu Ginobili"->"Tim Duncan" @0 {end_year: 2016, start_year: 2002}]] | + | "Tim Duncan" | [[:teammate "Tim Duncan"->"LaMarcus Aldridge" @0 {end_year: 2016, start_year: 2015}], [:like "LaMarcus Aldridge"->"Tim Duncan" @0 {likeness: 75}]] | + | "Tony Parker" | [[:teammate "Tim Duncan"->"Tony Parker" @0 {end_year: 2016, start_year: 2001}]] | + | "Tony Parker" | [[:teammate "Tim Duncan"->"LaMarcus Aldridge" @0 {end_year: 2016, start_year: 2015}], [:like "LaMarcus Aldridge"->"Tony Parker" @0 {likeness: 75}]] | + | "Tony Parker" | [[:like "Tim Duncan"->"Manu Ginobili" @0 {likeness: 95}], [:teammate "Manu Ginobili"->"Tony Parker" @0 {end_year: 2016, start_year: 2002}]] | + | "Tony Parker" | [[:teammate "Tim Duncan"->"Manu Ginobili" @0 {end_year: 2016, start_year: 2002}], [:teammate "Manu Ginobili"->"Tony Parker" @0 {end_year: 2016, start_year: 2002}]] | + | "Tony Parker" | [[:like "Tim Duncan"->"Tony Parker" @0 {likeness: 95}]] | + | "Trail Blazers" | [[:teammate "Tim Duncan"->"LaMarcus Aldridge" @0 {end_year: 2016, start_year: 2015}], [:serve "LaMarcus Aldridge"->"Trail Blazers" @0 {end_year: 2015, start_year: 2006}]] | + When executing query: + """ + MATCH (v) -[e1*0..1{likeness: 90}]-(v2:player{name: "Tony Parker"})-[*1..2]->(v3) + RETURN e1, v3 as Player ORDER BY Player + """ + Then the result should be, in any order: + | e1 | Player | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [] | ("Danny Green" :player{age: 31, name: "Danny Green"}) | + | [] | ("Grizzlies" :team{name: "Grizzlies"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Grizzlies" :team{name: "Grizzlies"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Hornets" :team{name: "Hornets"}) | + | [] | ("Hornets" :team{name: "Hornets"}) | + | [] | ("Kyle Anderson" :player{age: 25, name: "Kyle Anderson"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Kyle Anderson" :player{age: 25, name: "Kyle Anderson"}) | + | [] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [] | ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Spurs" :team{name: "Spurs"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [] | ("Tim Duncan" :bachelor{name: "Tim Duncan", speciality: "psychology"} :player{age: 42, name: "Tim Duncan"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | + | [] | ("Trail Blazers" :team{name: "Trail Blazers"}) | + | [[:like "Tony Parker"->"LaMarcus Aldridge" @0 {likeness: 90}]] | ("Trail Blazers" :team{name: "Trail Blazers"}) | + | [] | ("Trail Blazers" :team{name: "Trail Blazers"}) |