zoukankan      html  css  js  c++  java
  • neo4j语法

    图数据库在社交网络、实时推荐、征信系统、人工智能等领域有广泛应用。

    集群特征:主从复制,重选主服务器和容错;每个实例都有自己的本地缓冲

    性能优势:查询内不跨网络;实时操作,具有快速和一致的响应时间;缓冲分区,对于非常大的图,跨集群扩展缓冲。

    1. 安装

    安装现在是zip文件,解压后要配置环境变量,管理员运行cmd后执行:neo4j install-service,管理员运行cmd后执行:neo4j start,就可以进入浏览器7474界面。

    可以修改config,修改里面内存大小dbms.memory.heap.initial_size=1024m

    dbms.memory.heap.initial_size=1024m

    如果想实现远程访问,首先关闭Windows防火墙,在config中修改监听地址为 0.0.0.0。

    # To accept non-local connections, uncomment this line:

    dbms.connectors.default_listen_address=0.0.0.0

    2. 基本概念

    标签Label: 相当于数据表,比如Person

    节点Node: 每个标签下可以有N个节点Node,每个节点代表一个对象,相当于数据表里的一行。

    关系Relation: 几点之间的连线代表对象之间的关系。

    节点和关系都可以带若干属性。

    3. cypher语法

    ①创建节点

    Create (erzi:Person {id:'erzi'}),(baba:Person{id:'baba'}),//erzi别名

    (yeye:Person{id:'yeye', name:'zhangsan'}),

    (nainai:Person{id:'nainai'}),(mama:Person{id:'mama'}),

    (bozi:Person{id:'hozi'}),

    (erzi)-[:father]->(baba), (baba)-[:father]->(yeye),

    (baba)-[:mother]->(nainai), (erzi)-[:mother]->(mama),

    (erzi)-[:girlFriend]->(bozi)

    ②Match查找

    Match (n:Person {id:’erzi’}) Return n limit 25

    或者Match (n:Person) where n.id=’erzi’  Return n limit 25

    Match (n:Person) where n.id=’erzi’  Return n.name, n.id limit 25

    ③Merge 创建或者查询(已经存在)

    //如何给已经存在的节点添加新关系,并删除旧关系

    Match  (n:Person {id:’erzi’}) , (f:Person {id:’bozi’})

    Merge (n)-[r:fuqi]->(f) delete r

    Merge (n)-[r:FUQI]->(f)

    Return n, f

    ④更新Set

    Cypher无Update,用set代替

    //更新属性

    Match (n:Person{id:’baba’}) set n.name=’张三’, n.age=60  return n

    ⑤delete和remove

    删之前最好先return 害怕一不小心删错了

    Delete操作用于删除节点和关联关系

    Remove 操作用于删除标签和属性

    这两个命令都应该与MATCH命令一起使用

    Match (n:Person{id:’baba’}) remove n.age return n

    Match p=()-[r:teach]->() delete p //把所有teach的关系都删除

    Match (a:Person), (b:Person) where a.id=’erzi’ and b.id=’bozi’

    Merge (a)-[r:FUQI]->b

    Delete r

    Match (s:Teacher)-[r:teach] ->(d:Student) delete r,s,d //把关系和节点都删掉

    Match (n:Test) remove n:Test//删除label

    Match (n{name:’Andre’}) DETACH DELTET n

    ⑥order by

    Match (n:Person) Return n order by n.id,n.name desc skip 2 LIMIT 25

    ⑦Union和Union all

    Union:把多段Match的return结果拼成一个结果集。会自动去重

    Union all:作用同Union

    Match (n:Person) where n.age >30 Return n.id, n.age order by n.id,n.age union all Match (n:Person) where n.id=’erzi’ and n.age is not null return n.id, n.age

    Where 属性 is null

                is not null

    ⑧in

    Match (n:Person) where n.id in [‘erzi’,’bozi’,’baba’] and n.age is not null return n.id, n.age

    ⑨内置id

    每个relation都有个系统分配的id,从0开始递增,全局唯一。一般不会用内置的。通过函数id(node/relation)可以获取id

    用户可以自定义id属性,与内置id无关。

    Relation具有方向性,create节点之间关系时,必须指定方向,否则会报错,但是查询时,可以不指定,不指定他就会把双向的方向查出来。

    Match(n:Person)-[:FUQI]-(s:Person) Return distinct n,s

    ⑩索引index

    Create index on: Person(id);

    Drop index on: Person(id);

    不需要给索引起名称,只需要设置索引字段即可

    给哪些字段建索引呢?根据查询需要,把查询多的字段建索引。

    ⑾属性唯一性约束

    Create constrain on (a:Person) ASSERT a.id IS UNIQUE

    Drop constrain on (a:Person) ASSERT a.id IS UNIQUE

    ⑿where

    找到charlie和martin的最短路径,并且关系里面不存在father类型的关系。

    MATCH (charlie:Person { name: 'Charlie Sheen' }),(martin:Person { name: 'Martin Sheen' }),

    p =shortestPath((charlie)-[*]-(martin))

    WHERE NONE (r IN relationships(p) WHERE type(r)= 'FATHER')

    RETURN p

    ⑿常用函数shortestPath、allShortestPaths

    Upperlowersubstring eplace

    countmaxminsumavg 返回由Match命令返回的所有行的平均值等。。

    neo4j无group by

    Match (n:Person) return avg(n.age) ///只包含age不为空的节点

    Match (n:Person) return Substring(n.id,1,3), n.id

    Match p=shortestPath((n:Person{id=’mama’})-[*..3]-(b:Person{id=’nainai})) return p

    Match p=allshortestPaths((n:Person{id=’mama’})-[*..3]-(b:Person{id=’nainai})) return p

    关系链路越短,代表这两个节点的关系越密切。

    ⒀with

    Match (user)-[:friend]-(friend)

    Where user.name=$name

    With user, count(friend) As friends

    Where friends>10

    Return user

    4. 本地csv文件导入

    把你的数据放在import文件夹。

    LOAD CSV WITH HEADERS FROM "file:///高管节点.csv" AS row

    CREATE (:高管{ggname:row.ggname,gs:row.gs,url:row.url,phone:row.phone,email:row.email,address:row.address})

    LOAD CSV WITH HEADERS FROM "file:///资金.csv" AS row merge (n1:企业{名字:row.source}) with * merge (n2:企业{名字:row.target}) with * create (n1)-[i:借款]->(n2) set r.shaftWidth=row.weight

    #海量数据加载

    create constraint on (p:F_CERT) assert p.CASE_ID is unique; call apoc.periodic.iterate( "call apoc.load.jdbc('jdbc:oracle:thin:{username}/{password}@{hostip}:{port}:{servicename or sid}',"select case_id,proportion from invest where start_type='2' and end_type='2'")",

    "merge (n1:F_CERT{CASE_ID:row.START_ID}) with * merge (n2:F_CERT{CASE_ID:row.END_ID}) with * create (n1)-[i:INVEST]->(n2) set i+=row",

    {batchSize:100,iterateList:true})

    注意事项:

    1、节点里“主键”应建索引,唯一“主键”应建“约束”;2、merge时()中只出现“主键”,其余属性用set字句设定。

    4. 踩过的坑

    ①报错:CSV import : Cannot merge node using null property value

    数据里面出现了空值,去掉空值即可

    ②本来想批量导入关系,发现不行,必须分不同的关系分别导入

  • 相关阅读:
    CLR Via
    HTML&XML
    SNS研究
    DotNet&C#
    电子商务
    WCF学习
    SQL
    构架设计
    JS&Ajax
    NHibernate之旅系列文章导航
  • 原文地址:https://www.cnblogs.com/fionacai/p/9029995.html
Copyright © 2011-2022 走看看