图Dbs - 节点的位置 - 图论

时间:2015-01-08 22:13:08

标签: graph-theory graph-databases nosql

假设您有一组包含所有英文字母的节点,您的任务是使用一些通用的“object1”和“object2”节点以及您想要的多个边来存储单词“foo”和“four” ..

您将存储

之类的关系
(object1)--contains-->(f)
(object1)--contains-->(o)

(object2)--contains-->(f)
(object2)--contains-->(o)
(object2)--contains-->(u)
(object2)--contains-->(r)

因此您可以查询“包含”关系以查找给定单词的字母。

但是如何在“foo”中存储双“o”?

如何存储每个对象的字母顺序?

换句话说,如何存储节点的相对位置(例如:(a)来自(b)之前)?

如果那些位置必须在二维环境中(例如:网格中节点的位置)怎么办?

如何存储多个相似但独特的关系?

P.s:我一如既往地觉得我的英语很差,如果不清楚的话请问!

3 个答案:

答案 0 :(得分:1)

如果您可以为关系指定属性,而不仅仅是类型,那么

//创建栏作为关系属性

    create (bar)
    create (bar)-[:contains{order:0]->(b)
    create (bar)-[:contains{order:1]->(a)
    create (bar)-[:contains{order:2]->(r)

//创建食物作为关系属性

    create (food)
    create (food)-[:contains{order:0]->(f)
    create (food)-[:contains{order:1]->(o)
    create (food)-[:contains{order:2]->(o)
    create (food)-[:contains{order:3]->(d)

Neo4j支持这一点,认为上面的伪代码不能立即使用

答案 1 :(得分:1)

这是图表中链接列表的典型示例,假设单词 cool ,他可以像这样存储:

(word:Word {name:"cool"})-[:FIRST]->(c)-[:NEXT]->(o)-[:NEXT]->(o)-[:NEXT]->(l)<-[:LAST]-(word)

此表示可以帮助您获得有关字母的见解,如:

  • 字母o放置在哪个位置

  • 所有具有ool字母组合的单词

  • 获取所有以“all”

  • 开头的单词

这是一个带有图形表示http://console.neo4j.org/r/uzwded

的neo4j控制台

在控制台问题的情况下插入查询:

MERGE (cool:Word {name:'cool'})
MERGE (fool:Word {name:'fool'})
MERGE (cold:Word {name:'cold'})
CREATE (cool)-[:FIRST]->(:Letter {name:'c'})-[:NEXT]->(:Letter {name:'o'})-[:NEXT]->(:Letter {name:'o'})-[:NEXT]->(:Letter {name:'l'})<-[:LAST]-(cool)
CREATE (fool)-[:FIRST]->(:Letter {name:'f'})-[:NEXT]->(:Letter {name:'o'})-[:NEXT]->(:Letter {name:'o'})-[:NEXT]->(:Letter {name:'l'})<-[:LAST]-(fool)
CREATE (cold)-[:FIRST]->(:Letter {name:'c'})-[:NEXT]->(:Letter {name:'o'})-[:NEXT]->(:Letter {name:'l'})-[:NEXT]->(:Letter {name:'d'})<-[:LAST]-(cold)

答案 2 :(得分:0)

可能最好的解决方案是使用链接列表

//创建栏作为链表

    create (ar)-[:start]->(a)
    create (ar)-[:proceed]->(r)
    create (bar)-[:start]->(b)
    create (bar)-[:proceed]->(ar)

//创建食物作为链表

    create (od)-[:start]->(o)
    create (od)-[:proceed]->(d)
    create (ood)-[:start]->(o)
    create (ood)-[:proceed]->(od)
    create (food)-[:start]->(f)
    create (food)-[:proceed]->(ood)