最近因为项目建模需要使用到图数据库,搜了一圈,发现Neo4j就不错,于是开始鼓捣。
下载地址:https://neo4j.com/download-center/
官方提供了很多可选的下载项,企业版,社区版,桌面版。这里我下的是桌面版。
这里我们新建一个项目,然后点击Add Graph 新建一个本地的图数据库:
然后start一下,启动数据库,manage-> open browser
成功进入数据库。
官方有两个例子,其中一个就是Movie的图关系建模。
编辑器文本框输入:play movies 就可以查看这个demo。
然后我们根据步骤到create 这里,copy一下cypher语句,因为篇幅较长我们这里就截取一部分。
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967})
CREATE (Laurence:Person {name:'Laurence Fishburne', born:1961})
CREATE (Hugo:Person {name:'Hugo Weaving', born:1960})
CREATE (LillyW:Person {name:'Lilly Wachowski', born:1967})
CREATE (LanaW:Person {name:'Lana Wachowski', born:1965})
CREATE (JoelS:Person {name:'Joel Silver', born:1952})
CREATE
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),
(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix),
(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix),
(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix),
(LillyW)-[:DIRECTED]->(TheMatrix),
(LanaW)-[:DIRECTED]->(TheMatrix),
(JoelS)-[:PRODUCED]->(TheMatrix)
CREATE (Emil:Person {name:"Emil Eifrem", born:1978})
CREATE (Emil)-[:ACTED_IN {roles:["Emil"]}]->(TheMatrix)
然后我们查询一下:
WITH TomH as a
MATCH (a)-[:ACTED_IN]->(m)<-[:DIRECTED]-(d) RETURN a,m,d LIMIT 10
;
可以看到节点间的关系图形化界面:
当然如果你想查看跟某个节点相关的其他节点,可以选中节点并展开它,点击即可:
Neo4j的操作语言称为cyher,跟sql是一个道理。
除上面的create语句以外,Neo4j的cypher语法跟sql一样,涵盖了neo4j数据库CRUD的各个方面,还包括调用存储过程等。
match查询
match 可以不指定节点类型,实体节点用“()” 包裹起来,如“(a:movie)”表示一个movie类型的节点,在进行条件过滤时,可以直接在实体后面指定属性或者配合where 语句使用。
如:match(a:movie{name:'Avatar'}) 和 match (a:movie) where a.name = 'Avatar' 实现的是相同的功能。
关系节点用“[]”包裹起来,如 (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix)语句中的ACTED_IN 关系。在图中,它被抽象成实体节点间的一条有向边,因此,创建关系时需要指定关系的方向。关系也可以指定属性,比如[:ACTED_IN {roles:['Neo']}]
在图中,求最短路是一个非常常用的操作,这里用shortestpath()函数来求最短路,该函数只返回一条,如果需要求所有最短路,可以用allshortestpath()函数。例如下面求最短路的语句:
MATCH (a:Column),(b:Column) where a.name='username'and b.name='content'
match p = shortestpath((a)-[*]-(b)) return a,b,p
更多cypher语法请参考:https://neo4j.com/docs/cypher-refcard/current/
此外,如果遇到不清楚的,neo4jdesktop 提供了帮助文档:
比如像查看cypher 的语法,可以使用如下一些命令:
和其他数据库一样,neo4j同样提供java api用于编程操作。以maven 项目为例,简述一下操作的基本流程:
maven 依赖:
org.neo4j.driver
neo4j-java-driver
1.6.2
public class Neo4jDriver {
private Driver driver;
private static org.apache.log4j.Logger logger = Logger.getLogger(JDBCToSpark.class);
private static String NEO4J_CONFIG_PATH = "src/main/resources/sys/config/Neo4j.properties";
public Neo4jDriver() {
Properties properties = new Properties();
try {
properties.load(new FileInputStream(NEO4J_CONFIG_PATH));
} catch (IOException e) {
logger.error("can not find config file for neo4j.");
}
driver = GraphDatabase.driver(properties.getProperty("uri"), AuthTokens.basic(properties.getProperty("user"), properties.getProperty("passwd")));
}
/**
* run create statements
*
* @param txt
* @return
*/
public StatementResult exeStatement(String txt) {
Session session = driver.session();
Transaction transaction = session.beginTransaction();
StatementResult result = transaction.run(txt);
transaction.success();
session.close();
return result;
}
/**
* explicitly call this method to stop the driver instance
*/
public void stop() {
driver.closeAsync();
}
public static void main(String[] args) {
Neo4jDriver driver = new Neo4jDriver();
StatementResult result = driver.exeStatement("MATCH (c)<-[:COLUMN_OF]-(a) return a,c");
while (result.hasNext()) {
System.out.println(result.next());
}
driver.stop();
}
}
至于路径遍历等,大家就自己下去摸索吧。
为方便修改,我们写了一个配置文件,配置如下:
uri=bolt://localhost:11004
user=neo4j
passwd=***
以上就是Neo4j基本的入门级操作和java api调用方式,希望看这篇文章的人对于Neo4j有一个初步的了解。