图数据库Neo4J的使用

时间:2022-08-09 18:02:33

图数据库Neo4J的使用

吴斌 2013.7.5

1,图数据库Neo4J的介绍:

http://www.neo4j.org/learn/neo4j

Neo4J是个开源的图数据,很好用,轻便灵活,嵌入式,功能强大,而且相关资料比较齐全。

按照Neo4J官方网站公布,该数据库可以支持数十亿的节点数:

massively scalable, up to several billion nodes/relationships/properties

而且支持分布式部署,Master,Slave。

对Neo4J的性能和可用性的介绍:http://video.neo4j.org/player/6qUmb/native/autoplay/

Neo4J的CEO有个视频简单介绍Neo4J:http://player.vimeo.com/video/56040747

 

2,安装:

Neo4J的安装使用非常简单。下载一个稳定版本,解压,运行Neo4j.bat(windows版本) 即可。下载地址http://www.neo4j.org/download , 目前比较好用的稳定版本是1.9.1。

然后可以访问WEB管理界面,地址:http://localhost:7474/webadmin

 

3,Neo4J的使用方式包括:

1)可以写程序,添加,更新,用JAVA,Python,PHP, .NET等语言都可以实现。

2)可以用命令行,添加,更新,查看,Neo4J提供基于WEB的执行界面,提供类SQL语言执行,这些语言包括Cypher,Gremlin等。

如下图:

图数据库Neo4J的使用

3)可以基于Neo4J提供的WEB UI界面添加,更新节点和关系,如下:

图数据库Neo4J的使用

4) 可以使用附加工具(ETL)导入数据。也可以从关系数据库中导入数据。

http://www.neo4j.org/develop/import

 

4,使用JAVA访问Neo4J:

学习材料:http://www.neo4j.org/develop/java

http://docs.neo4j.org/chunked/stable/tutorials-java-embedded.html

Neo4J中节点,边,都可以任意添加属性,边(关系)的可以自定义,是个枚举值,举例:

firstNode = graphDb.createNode();

firstNode.setProperty( "message","Hello, [Node A] ,  ");

secondNode = graphDb.createNode();

secondNode.setProperty( "message", " The Graph DB World! [Node B] " );

relationship = firstNode.createRelationshipTo( secondNode, RelTypes.KNOWS );

relationship.setProperty( "Reason", "Use Neo4j for testing [Edge] ,  " );

 

还有一点很重要,Neo4J可以支持自定义节点类,就是说你可以按照你的需要设计Class做节点,也就是说你可以给每个节点增加任意方法,实现任意功能,这个功能的扩展性非常强。

而且Neo4J提供嵌入式程序的能力,你可以把它当做一个Lib来使用,可以在保留其他应用开放方式的情况下,提供图数据库的强大能力。

其例子socnet可以在Neo4J的网站上查找。

 

5,Cypher介绍:

Cypher是Neo4J自己提供的一种高效类SQL语言,用于图数据和关系查询。关系查询采用一种模式匹配的方式,比较直观。

很好的学习材料:http://www.neo4j.org/learn/cypher

这个Video讲的很清楚:http://player.vimeo.com/video/50389825

 

创建节点:(每个Node,系统会自动建立一个唯一的id,不可修改。下面的ID是Node的属性。)

create n={name:'Motion',ID:'M001'} return n;

创建关系:

start n=node(14),m=node(20) create m-[r:KNOWS]-n return r;

 

查询:

按id查询(这里的id是系统自动创建的):

start n=node(20) return m;

 

查询所有节点:

start n=node(*) return n;

查询属性,关系:

start n=node(9) return n,n.name,n.ID,n.level;//查看指定节点,返回需要的属性

 

start n=node(*) match(n)-[r:SubClassOf]->m return m,n,n.name,n.ID,r; //查找指定关系

 

按关系查询多个节点:

start a = node(14) match b-[r]<->a return r,b;

 

start a = node(0) match c-[:KNOWS]->b-[:KNOWS]->a return a,b,c;//查找两层KNOWS关系的节点

 

start a = node(21) match b-[*]->a returna,b;  //查找所有与a节点有关系的节点

 

使用Where条件进行查询:(不用建立Index也可以使用)

start n=node(*) where n.name="Activity"return n;

并且可以使用特定符号:

start n=node(*) where n.ID?="A*"return n;

start n=node(*) where HAS(n.type) return n,n.name,n.ID,n.type;//如果存在属性type,并且以A开头,就输出节点。

 

配置文件自动建立索引:

修改conf目录下的neo4j.properties文件内容如下,重启Neo4J,对重启后新建的Node生效。

# Enable auto-indexing for nodes, defaultis false

node_auto_indexing=true

 

# The node property keys to beauto-indexed, if enabled

node_keys_indexable=name,ID

# Enable auto-indexing for relationships,default is false

relationship_auto_indexing=true

 

# The relationship property keys to beauto-indexed, if enabled

relationship_keys_indexable=KNOWS,SubClassOf

 

建立索引后可以用node_auto_index按属性值查询:

startn=node:node_auto_index(name="C") return n,n.name;

 

修改属性值:

start a = node(*) wherea.name="a" set a.name="A" return a,a.name ;

start n=node(0) set n.name="Root",n.ID="001" ;//给默认的根节点添加name,ID属性,便于查询。

 

删除:

删除所有节点和关系:

START n=node(*)

match n-[r]-()

delete n,r;

 

6,图形化显示数据:

Neo4J自身提供WEB界面的图数据图形化展现工具,很Cool。这个Video讲的具体:https://player.vimeo.com/video/58016492

 图数据库Neo4J的使用

在WEB管理http://localhost:7474/webadmin的“Data Browser”图形化显示区点Style,NewProfile,编辑自己的Profile,注意Add filter的 Nodes要放在前面,不然不生效,Rules是顺序执行的,显示多个属性可以用;号做换行符。

 

看我做的一个UserModel Ontology 关系模型:

图数据库Neo4J的使用

 

User Model 与数据源的Ontology关系,左边圆圈是UserModel,右边方框是数据源:

图数据库Neo4J的使用

 

在Data Browser上直接输入节点编号,如10,点图形化显示,就可以图形化看到该节点和有关系的节点,点每个节点,就可以逐步显示所有节点和关系,非常方便:

图数据库Neo4J的使用

 

7,备份Neo4j的数据:

1)停掉数据库.

2)备份D:\Neo4J\neo4j-enterprise-1.9.1\data目录下graph.db目录中的所有内容.

3)在服务器上拷贝graph.db目录中的内容到新的服务器的相同目录中,启动即可.

 

8,为什么使用图数据库?

这个问题,欢迎你跟我交流。图数据库的扩展性,灵活性非常好,适合用于复杂关系管理和关系查询推理,社交关系应用就是一个可选的应用场景。而我选择图数据库,起因是研究语义网和Ontology的应用,语义网和Ontology的数据结构(三元组)就是图结构数据,而基于RDF构建的语义网,过于复杂,效率很低,实际上不如基于图数据库的构建方便好用,而且Neo4J支持RDF,SPARQL等扩展。另外,我认为OWL,实用价值不大,OWL几乎就是用XML来描述一种面向对象的编程语言,而这种编程语言如果表示能力过强(OWLFull),根本无法实现,如果表示能力过弱(OWL Lite),其实没有多少实用意义。而且,我觉得Tim Berners-Lee的语义网,即基于RDF的语义WEB,用RDF描述语义的这种思路走向了以前基于规则的NLP的思路,虽然加上HumanComputation 众包的模式,但还是很难走通。我更关注的是本体关系,知识库的构建,而且知识本体主要是Meta Data,不需要很多数据,尽量不要保存instance data,获取instance data可以关联其他数据库的数据源进行查询(这种数据Key-Value或Table保存即可)。

简单的关系推理,属性传递,其实就是查询,Neo4J中Cypher也可以完成。所以,我倾向于用图数据库来构建知识库knowledgebase ("KB"),或knowledge graph ("KG")。知识库对于知识关联查询进行相关搜索或关联推荐,比较有价值。而且,从知识本体关系库中可以推理得到规则,比如,IfPlace is Meeting Room and Date isWorkday andThan Activity isMeeting.  这样的规则是可以从本体关系中查询得到的,规则可以在很大程度上弥补基于统计的计算学习的许多不足。更大的作用,我觉得图数据库是一种 “合理的知识保存和描述的方式”,有利于知识的持续积累和不断演进。另外,在未来,知识本体,与模型算法建立关系,如果能在合适的关系条件下,使用正确的算法模型,那将发挥真正的巨大作用,那就离”智能“很近了。



http://ub1010.51.net