假设您有一组包含所有英文字母的节点,您的任务是使用一些通用的“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:我一如既往地觉得我的英语很差,如果不清楚的话请问!
答案 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)