首页 > 代码库 > Cypher 描述性的图像查询语言
Cypher 描述性的图像查询语言
1 /** 2 * 使用cypherParser语言 3 * @author 裴东辉 4 * @since 2014-8-4 下午3:22:25 5 */ 6 public void userCypherParser(){ 7 //执行一个Cypher Query的查询 8 GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( "db/music.db" ); 9 try(Transaction tx = graphDb.beginTx()){ 10 /*API org.neo4j.cypher.javacompat.ExecutionEngine:To run a Cypher query, use this class. 11 ExecutionEngine(GraphDatabaseService database) Creates an execution engine around the give graph database 12 Method: 13 ExecutionResult execute(String query) 14 Executes a query and returns an iterable that contains the result set 15 */ 16 ExecutionEngine engine = new ExecutionEngine(graphDb); 17 //使用cypher语言进行查询-----一个描述性的图形查询语言 18 //你参考部分的模式时,需要通过命名完成。定义的不同的命名部分就被称为标识符。 19 //得到所有节点可以通过星号(*),同样对于关系也适用。 20 System.out.println("----------------------------nodes----------------------------"); 21 ExecutionResult result = engine.execute( "start n=node(*) return n" ); 22 //获取指定列的结果集 23 Iterator<Node> nodeIta = result.columnAs("n"); 24 Node node=null; 25 while(nodeIta.hasNext()){ 26 node=nodeIta.next(); 27 info(node+"-;node name="+node.getProperty("name")); 28 } 29 30 //关系数据 31 System.out.println("----------------------------relationship----------------------------"); 32 //得到所有节点可以通过星号(*),同样对于关系也适用。 33 result = engine.execute( "start n=relationship(*) return n" ); 34 //获取指定列的结果集 35 Iterator<Relationship> relationshipIta = result.columnAs("n"); 36 Relationship relationship=null; 37 while(relationshipIta.hasNext()){ 38 relationship=relationshipIta.next(); 39 info(relationship+"-;start node:"+relationship.getStartNode().getProperty("name")); 40 } 41 42 //通过索引查询获取节点 43 /*如果开始节点可以通过索引查询得到,可以如此来写: 44 node:indexName(key=”value”)。 45 查询: START n=node:nodes(name = "A") RETURN n 索引中命名为A的节点将被返回。 46 */ 47 System.out.println("----------------------------索引查询节点----------------------------"); 48 //在此列子中存在一个节点索引叫nodes。 49 result = engine.execute( "start n=node:nodes(name=‘歌手 1的专辑 1‘) return n" ); 50 //获取指定列的结果集 51 nodeIta = result.columnAs("n"); 52 while(nodeIta.hasNext()){ 53 node=nodeIta.next(); 54 info(node+"-;node name="+node.getProperty("name")); 55 } 56 57 //通过索引获取关系 58 System.out.println("----------------------------索引查询关系----------------------------"); 59 //得到所有节点可以通过星号(*),同样对于关系也适用。 60 result = engine.execute( "start n=relationship:relationships(publishtime=‘2014-10-10‘) return n" ); 61 //获取指定列的结果集 62 relationshipIta = result.columnAs("n"); 63 while(relationshipIta.hasNext()){ 64 relationship=relationshipIta.next(); 65 info(relationship+"-;start node:"+relationship.getStartNode().getProperty("name")); 66 } 67 68 //Match--http://www.uml.org.cn/sjjm/201203063.asp 69 /*Match语句 70 在一个查询的匹配(match)部分申明图形(模式)。模式的申明导致一个或多个以逗号隔开的路径(path)。 71 节点标识符可以使用或者不是用圆括号。使用圆括号与不使用圆括号完全对等,如: 72 MATCH(a)-->(b) 与 MATCH a-->b 匹配模式完全相同。 73 模式的所有部分都直接或者间接地绑定到开始点上。 74 可选关系是一个可选描述模式的方法,但在真正图中可能没有匹配(节点可能没有或者没有此类关系时),将被估值为null。 75 与SQL中的外联结类似,如果Cypher发现一个或者多个匹配,将会全部返回。如果没有匹配,Cypher将返回null。 76 */ 77 System.out.println("----------------------------Match查询与节点--相关节点----------------------------"); 78 //在此列子中存在一个节点索引叫nodes。 79 //符号—意味着相关性,不需要关心方向和类型。 80 //当对关系的方向感兴趣时,可以使用-->或<--符号,如: 81 result = engine.execute( "start n=node(0) match (n)-->(x) return x" ); 82 //获取指定列的结果集 83 nodeIta = result.columnAs("x"); 84 while(nodeIta.hasNext()){ 85 node=nodeIta.next(); 86 info(node+"-;node name="+node.getProperty("name")); 87 } 88 89 //定向关系和标识符 90 /*如果需要关系的标识符,为了过滤关系的属性或为了返回关系,可如下例使用标识符。 91 查询: 92 START n=node(3) MATCH (n)-[r]->() RETURN r 93 所有从节点A接出的关系将被返回。 94 */ 95 System.out.println("----------------------------Match查询与节点--这个节点所有点击的关系----------------------------"); 96 //得到所有节点可以通过星号(*),同样对于关系也适用。 97 result = engine.execute( "start n=node(0) match (n)-[r]->() return r" ); 98 //获取指定列的结果集 99 relationshipIta = result.columnAs("r");100 while(relationshipIta.hasNext()){101 relationship=relationshipIta.next();102 info(relationship+"-;start node:"+relationship.getStartNode().getProperty("name")); 103 }104 105 //通过关系类型匹配到从这个节点发出的某个关系的所有节点106 System.out.println("----------------------------Match查询通过关系类型匹配到从这个节点发出的某个关系的所有节点----------------------------");107 result = engine.execute( "start n=node(0) match (n)-[:PUBLISH]->(x) return x" ); 108 //获取指定列的结果集 109 nodeIta = result.columnAs("x");110 while(nodeIta.hasNext()){111 node=nodeIta.next();112 info(node+"-;node name="+node.getProperty("name")); 113 }114 115 //通过关系类型匹配和使用标识符116 System.out.println("----------------------------Match通过关系类型匹配和使用标识符----------------------------");117 result = engine.execute( "start n=node(0) match (n)-[r:PUBLISH]->() return r" ); 118 //获取指定列的结果集 119 relationshipIta = result.columnAs("r");120 while(relationshipIta.hasNext()){121 relationship=relationshipIta.next();122 info(relationship+"-;start node:"+relationship.getStartNode().getProperty("name")); 123 }124 125 //多重关系---这一下就解决了这个歌手的所有歌曲的信息126 System.out.println("----------------------------Match 多重关系----------------------------");127 result = engine.execute( "start n=node(0) match (n)-[:PUBLISH]->(a)-[:CONTAIN]->(x) return x" ); 128 //获取指定列的结果集 129 nodeIta = result.columnAs("x");130 while(nodeIta.hasNext()){131 node=nodeIta.next();132 info(node+"-;node name="+node.getProperty("name")); 133 }134 135 }finally{136 graphDb.shutdown();137 }138 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。