介绍
什么是图表?
图形是由边连接的一组顶点。 在数据库领域中,图形是一组项目,每个项目与数据集中的另一个项目具有任何类型的关系。
什么是顶点和边?
顶点 - 顶点是图形中的数据点。 对于熟悉任何形式的SQL数据库的人来说,一个顶点可以被视为一个行/记录。 对于那些不熟悉SQL的人来说,一个顶点可以被视为一块数据。
边 - 边是两个不同顶点之间的关系。 边缘很难转换为SQL术语,因为它们与图形数据库的灵活性,但边缘可以视为两个数据连接的方式。
例
社交网络是大多数人可以关注的图表的最好例子之一。 在社交网络中,你有人,你有每个人之间的关系。 人们被表示为顶点,并且关系被表示为边。 有许多不同类型的关系,例如:已婚,朋友,与关系,与工作等。这对于图形是相同的。 对于不同类型的边缘存在无穷的可能性,并且对于不同类型的顶点存在无限的可能性。
一个图画的例子
在这张图片中,图形顶点只是整数,边缘没有标记。 尽管简单,这仍然是一个图。
加权图
在航空公司的例子中,当处理从点A到点B的飞机时,你想要选择飞机可能的最佳路径。 让机场可视化为顶点,它们之间的飞行路径是边缘。
每个边缘被分配权重或成本,以便利用它。 这里,权重表示两个机场之间的距离。 因此,例如,在上图中,从LAX到ORD的成本是1749.加权图在地理数据表示中特别有用,其中距离是一个因素。
图数据库
图形数据库是将信息存储为顶点和边(节点和关系)的NoSQL数据库。 不使用外键和select语句,而是使用边和图遍历来查询数据。 在许多情况下,例如社交网络,生物学,化学,业务分析以及其中数据最好表示为与数据集中的其他项目具有关系的项目的任何情况下,这种查询数据的方法是非常强大的。
在本教程中,我们将安装Neo4J:一个非常受欢迎的图形数据库,具有许多语言绑定,几乎任何流行的编程语言。
安装Neo4J
将Neo4J密钥添加到apt程序包管理器中:
wget -O - http://debian.neo4j.org/neotechnology.gpg.key | apt-key add -
将Neo4J添加到Apt源列表:
echo 'deb http://debian.neo4j.org/repo stable/' > /etc/apt/sources.list.d/neo4j.list
更新包管理器:
apt-get update
安装Neo4J:
apt-get install neo4j
Neo4J应该运行。 您可以使用以下命令检查此
service neo4j-service status
Neo4J RESTful API和Cypher查询语言
使Neo4J真棒的一个事情是它有一个非常容易使用的RESTful API,这意味着它几乎可以使用任何可以使Web请求的编程语言。 在Neo4J数据库上执行的许多操作都是使用Cypher查询执行的。 Cypher查询语言是Neo4J用于操作和读取数据的查询语言。 Cypher是Neo4J,因为SQL是MySQL。
对Neo4J RESTful API的Web请求的结构如下:
curl -H "Accept: application/json; charset=UTF-8" -H "Content-Type: application/json" -X POST http://SERVERNAME:7474/db/data/cypher -d '{
"query" : "CYPHER QUERY GOES HERE",
"params" : {
QUERY PARAMETERS GO HERE
}
}'
将数据添加到Neo4J
Neo4J是一个数据库,数据库需要数据,所以让我们添加一些数据!
创建新节点:
curl -H "Accept: application/json; charset=UTF-8" -H "Content-Type: application/json" -X POST http://localhost:7474/db/data/cypher -d '{
"query" : "CREATE (n:Person { name : {name} }) RETURN n",
"params" : {
"name" : "Foo"
}
}'
我之前提到图数据库将数据存储为节点和关系。 一个关系需要两个节点,所以让我们创建另一个节点:
curl -H "Accept: application/json; charset=UTF-8" -H "Content-Type: application/json" -X POST http://localhost:7474/db/data/cypher -d '{
"query" : "CREATE (n:Person { name : {name} }) RETURN n",
"params" : {
"name" : "Bar"
}
}'
现在我们可以创建这两个节点之间的关系:
curl -H "Accept: application/json; charset=UTF-8" -H "Content-Type: application/json" -X POST http://localhost:7474/db/data/node/0/relationships -d '{
"to" : "http://localhost:7474/db/data/node/1",
"type" : "Comes Before"
}
}'
使用Cypher查询Neo4J
下面是一些示例cypher查询,我们可以用来查看我们以前插入的数据。
我们可以从我们创建的第一个节点开始,并获得所有连接的节点和对应的关系:
curl -H "Accept: application/json; charset=UTF-8" -H "Content-Type: application/json" -X POST http://localhost:7474/db/data/cypher -d '{
"query" : "MATCH (x {name: {startName}})-[r]->(n) RETURN type(r), n.name",
"params" : {
"startName" : "Foo"
}
}'
返回图中所有节点的name属性(注意:这不应该在大图上执行):
curl -H "Accept: application/json; charset=UTF-8" -H "Content-Type: application/json" -X POST http://localhost:7474/db/data/cypher -d '{
"query" : "START n = node(*) return n.name",
"params" : {
}
}'
返回图中的所有关系类型(注意:这不应该在大图上执行):
curl -H "Accept: application/json; charset=UTF-8" -H "Content-Type: application/json" -X POST http://localhost:7474/db/data/cypher -d '{
"query" : "START r=rel(*) return type(r) ",
"params" : {
}
}'
更完整的描述和由Neo4j的RESTful的API提供的方法的列表可发现此处 ,并且可以发现在Cypher支架查询语言信息此处 。