有三个商店(语义数据库),还有通用图形数据库.
两者都基于通过关系将一个"项目"链接到另一个"项目"的类似概念.Triplestores支持RDF并由SPARQL查询,但是这些附加组件也可以(并且)在通用图形数据库的顶部实现.
什么是使您更喜欢语义db/triplestore到neo4j这样的通用图数据库的根本区别?
我试图建立一个数据库,每当一个节点不存在时,它将创建一个新的并在此节点和另一个节点之间建立关系.如果节点存在,则两个节点都会建立关系.
我的问题是,如果我尝试连接2个现有节点,将重新创建第二个节点.我尝试使用MERGE和CREATE UNIQUE,两者都没有用.
我的例子:
CREATE (test1 name:'1'})
MATCH (n)
WHERE n.name = '1'
MERGE (n)-[:know {r:'123'}]->(test3 {name:'3'})
MATCH (n)
WHERE n.name = '1'
MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'})
Run Code Online (Sandbox Code Playgroud)
到这里它的工作原理,但:
MATCH (n)
WHERE n.name = '3'
MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'})
Run Code Online (Sandbox Code Playgroud)
它创建一个新节点"2"而不是连接到存在的节点.
我删除了所有节点和关系(删除neo4j 1.8中的所有节点和关系),但我看到在Neo4j浏览器中,删除之前存在的"属性键"仍然存在.
见下图:
如何让所有"属性键"消失,所以我最终可以得到一个全新的数据库?我理解这个孤立属性键本身并不会造成问题,但它们会使浏览器体验变得混乱,并且会开始混淆新属性.
谢谢!
在今天可以使用图形数据库解决的Web环境中,可以遇到的问题是什么?图形数据库是否适用于经典应用程序,即可以用作关系数据库的替代品吗?所以实际上这是两个问题.
TL; DR:我要么失去理智,要么neo4j的交易稍有破产.看起来未提交的节点在提交的事务之外可用,缺少属性 - 或者同样奇怪的东西.
我们的node.js应用程序使用neo4j.它的一部分必须生成唯一的ID.我们有以下cypher查询,用于查找最后一个:Id类型的节点并尝试使用提交新:Id节点last_uuid+1.
MATCH (i:Id) WITH i ORDER BY i.uuid DESC LIMIT 1 #with it like a sub-return, will "run" the rest with the last i at read-time
CREATE (n:Id {label:"Test"})
SET n.uuid = i.uuid + 1
RETURN n
Run Code Online (Sandbox Code Playgroud)
还有一个约束:
neo4j-sh (?)$ schema
Indexes
ON :Id(uuid) ONLINE (for uniqueness constraint)
Constraints
ON (id:Id) ASSERT id.uuid IS UNIQUE
Run Code Online (Sandbox Code Playgroud)
并初始化DB (:Id{uuid:1})以启动这种快乐.
应用程序代码基本上会重试上述查询,直到成功为止.如果两个或多个Id创建请求同时命中,其中只有一个将通过,其余的将失败并由应用程序代码重试.
这是有效的,直到我们并行尝试.
代码在没有uuid的情况下开始返回数据.经过大量的调查,结果是查询的写入部分(CREATE ...)以某种方式从MATCH接收:Id,没有.uuid(或其他)属性.这不应该是可能的.这是在这些节点上运行的唯一代码.
最奇怪的(也许)的事情是,如果我救i的nodeid,以找到在数据库节点,它确实存在,并有.uuid属性.
为了隔离这种行为,我编写了一个PoC: …
假设你是Twitter,并且:
(:User)和(:Tweet)节点;您可以为这些推文添加标签,例如:AwaitingModeration,添加和索引属性,例如isAwaitingModeration = true|false.
一种选择本质上比另一种更好吗?
我知道最好的答案可能是尝试加载测试两个:),但Neo4j的实现POV有什么能使一个选项更健壮或适合这种查询吗?
这取决于任何特定时刻这种状态的推文数量吗?如果它在10s与1000s之间,那会有所作为吗?
我的印象是标签更适合大量节点,而索引属性对于较小的卷(理想情况下,唯一节点)更好,但我不确定这是否真的如此.
谢谢!
我试图获得一个非常简单的Cypher查询的关系类型,如下所示
MATCH (n)-[r]-(m) RETURN n, r, m;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会返回一个空对象r.这很麻烦,因为我无法区分不同类型的关系.我可以通过添加属性来修补此问题,[r:KNOWS {type:'KNOWS'}]但我想知道是否没有直接获取关系类型的方法.
我甚至按照官方的Neo4J教程(如下所述),展示了这个问题.
图表设置:
create (_0 {`age`:55, `happy`:"Yes!", `name`:"A"})
create (_1 {`name`:"B"})
create _0-[:`KNOWS`]->_1
create _0-[:`BLOCKS`]->_1
Run Code Online (Sandbox Code Playgroud)
查询:
MATCH p=(a { name: "A" })-[r]->(b)
RETURN *
Run Code Online (Sandbox Code Playgroud)
JSON RESPONSE BODY:
{
"results": [
{
"columns": [
"a",
"b",
"p",
"r"
],
"data": [
{
"row": [
{
"name": "A",
"age": 55,
"happy": "Yes!"
},
{
"name": "B"
},
[
{
"name": "A",
"age": 55,
"happy": "Yes!" …Run Code Online (Sandbox Code Playgroud) 我没有想法,希望得到一些有用的意见.我正在使用这个问题来压缩我的经验并分享它们,希望激励一些经销商进一步将图形数据库建模作为一流的问题/方式.
我已经验证了node.js可以使用的一些图形数据库解决方案几周.我的用例是保存不同社交用户网络帐户的交互.需要以最有效的方式使用CPU和内存.
我最重要的要求是:
Neo4j的
我真的很喜欢密码,所以我最好的选择是Neo4j.但是关于Neo4j的主要问题是JavaScript访问是非原生的.它使用的REST-API 比直接Java访问慢大约十倍(10倍).所以我看了一下node-neo4j-embedded,但它已经处于非活动状态超过两年了.看起来它的作者根本不活跃(坏迹象).
ArangoDB
ArangoDB非常好的核心开发人员回答了我关于内部的问题.最后,它意味着JavaScript是一流的公民,因为本机查询可以被推出JS.看看开源基准测试,我认为这是公平的.但我担心他们没有使用node-neo4j-embedded作为他们的基准.基准测试比较REST-API(由于@weinberger评论而编辑).我希望他们比较本机API(也许有人足够snoopy并尝试一下! - 让我们知道!).更新:正如我现在注意到的那样,OrientDB 用新的node.js驱动程序回答了基准测试(通过启动服务器使用命令高速缓存)-Dcommand.cache.enabled = true -Dcommand.cache.minExecutionTime = 3,什么是不公平的,因为它不是查询缓存基准!)
因为我喜欢使用ArangoDB作为图形数据库,所以我有3个选择(来源:FAQ):
一般来说,它像cypher一样不舒服.我不确定如何比较以及建模数据的正确方法(如Neo4J解释得很好).我很想为ArangoDB Graphs提供类似的东西.感觉ArangoDB专注于图形操作,如果你有更多的关系而不是行,Neo4J更符合使用图形的需要(使用图形而不是连接关系的原因).
MongoDB的
基于文档的MongoDB没有针对图形操作进行优化,但后来获得了实验性的内存存储引擎.还有一些项目是in_memory或图形相关,但没有什么是真正引人注目的.在本次讨论中,看起来MongoDB并不是我喜欢使用的.
OrientDB
因为有一个关于OrientDB和MongoDB的比较(来自OrientDB),我虽然即将使用这个." OrientDB有一个混合的Document-Graph引擎 …
是否有针对Neo4j的.NET版本/绑定?
它看起来正是我想要的,但我在.NET上使用C#.
谢谢
neo4j ×10
cypher ×4
graph ×2
orientdb ×2
.net ×1
arangodb ×1
c# ×1
flockdb ×1
lokijs ×1
node-neo4j ×1
node.js ×1
nosql ×1
rexster ×1
scalability ×1
semantics ×1
transactions ×1
triplestore ×1