[Neo4j] Re: Triple-Like 'facts' instead of Hyper-edges ?

2016-03-15 Thread John O'Gorman
Thanks for the input.

Without knowing just how expensive my model is in terms of performance I 
believe I have some pretty solid reasons for the verbosity. (DNA, in spite 
of having only four base pairs is also verbose, so maybe I'm on to 
something. :D )

Part of the reason for the existence of silos in enterprises is the number 
of admittedly valid ways that developers can turn a finite number of 
elements into infinite arrangements of structures - and that's not 
including the infinite number of ways business users do similar things with 
documents, but let's leave that for now.

Q6 (the name of my model) is designed to start to fix that. It extends the 
set of things apps typically manage (entities, methods and states) to 
include all six interrogative classes: Agents, Assets, Locations, 
Functions, Actions and States. By placing an admittedly verbose collection 
in the Node class of property graphs I can enforce their semantics in a 
more business-like way.  I can also create semantically equivalent nodes 
that handle things like language translations, acronyms, aliases and codes 
in a much more elegant way.  For example, when I use 'Role' as a node to 
connect "John O'Gorman" with 'Chief Disambiguation  Officer' I can do so 
with much more confidence (on both the business and technology sides of the 
transaction) than I would see if I declared the same relationship as an 
edge.

If you'd like to learn more about where the model came from and where it is 
likely to end up, please drop me a line at jogor...@qsi-x.com and I will 
send you a couple of things to have a look at.

On Monday, March 14, 2016 at 2:04:47 PM UTC-6, Bo Ferri wrote:

> Hi John,
>
> your current model looks very verbose. Is there any reason besides 
> "semantically sloppy edges" to model it in this verbose way? I'm not sure 
> whether this "hyperedge imitation" is really necessary. You 
> can also utilise URIs (or prefixed URIs) as identifiers for relationship 
> types. Furthermore, in a property graph you can assign properties (e.g. 
> qualified attributes) to relationships as well.
> The model we've implemented in the d:swarm graph extension is rather 
> expensive, since the common use case for property graphs is to assign 
> literal properties as property at nodes (rather then via an extra 
> relationship) and "only" utilise relationships when connecting two entities 
> (i.e. not everything as node-edge-node statement). Your model is (from my 
> understanding) even more expensive then the one of the d:swarm graph 
> extension. So I think you need very important reasons, if you would like to 
> go this way. Otherwise, I would recommend to revise your model to a more 
> simple one.
>
> just my 5p ;-)
>
> Cheers,
>
>
> Bo  
>
> On Monday, March 14, 2016 at 6:24:27 PM UTC+1, John O'Gorman wrote:
>
>> Hi Bo - I think you may have put me back on track.
>>
>> The answer to you question is both: I drew up a summary of the problem 
>> (that I should have posted first) so apologies for the fogginess of my 
>> original posts.
>>
>> Here it is:
>>
>> All of my nodes are designed for reuse. I use GUIDs as identifiers. See 
>> the Declarative diagram, below.
>>
>>
>> 
>>
>>
>>
>>
>> When I create a statement (graph) I associate three nodes to create a 
>> relationship.  The reason I use nodes to establish the nature of the 
>> relationship is to avoid semantically sloppy edges. For example, I could 
>> use "Lives_In" or "Resides_In" or "Has_Home_In" to connect 'Fred 
>> Flintstone' and 'Bedrock' but I chose to model it this way:
>>
>>
>> 
>>
>>
>> The statement: "Fred Flintstone Is A Resident of Bedrock" is true and 
>> navigable. I have assigned it a GUID to help describe what I want to do 
>> after I load more relationships. But  here is where I get into some 
>> trouble. When I make a statement about Fred's friend Gill I want to reuse 
>> the "Resident" node:
>>
>>
>> 
>>
>> Again, I assigned a GUID for the statement as a place-holder.  When I 
>> load all this into Neo4J (not including the statement GUIDs) I get this:
>>
>>
>>
>> 
>>
>>
>> Without the statement GUIDs in there somewhere, the residency of both 
>> Fred and Gill is in doubt, yes?
>>
>> I will read the material you sent (many, many thanks) and see if what you 
>> are proposing solves this dilemma for me. 
>>
>> Best regards.
>>
>> John O'
>>
>> On Sunday, March 13, 2016 at 7:57:04 AM UTC-6, Bo Ferri wrote:
>>>
>>> Hi John,
>>>
>>> I'm 

[Neo4j] Re: Triple-Like 'facts' instead of Hyper-edges ?

2016-03-14 Thread 'Bo Ferri' via Neo4j
Hi John,

your current model looks very verbose. Is there any reason besides 
"semantically sloppy edges" to model it in this verbose way? I'm not sure 
whether this "hyperedge imitation" is really necessary. You 
can also utilise URIs (or prefixed URIs) as identifiers for relationship 
types. Furthermore, in a property graph you can assign properties (e.g. 
qualified attributes) to relationships as well.
The model we've implemented in the d:swarm graph extension is rather 
expensive, since the common use case for property graphs is to assign 
literal properties as property at nodes (rather then via an extra 
relationship) and "only" utilise relationships when connecting two entities 
(i.e. not everything as node-edge-node statement). Your model is (from my 
understanding) even more expensive then the one of the d:swarm graph 
extension. So I think you need very important reasons, if you would like to 
go this way. Otherwise, I would recommend to revise your model to a more 
simple one.

just my 5p ;-)

Cheers,


Bo  

On Monday, March 14, 2016 at 6:24:27 PM UTC+1, John O'Gorman wrote:

> Hi Bo - I think you may have put me back on track.
>
> The answer to you question is both: I drew up a summary of the problem 
> (that I should have posted first) so apologies for the fogginess of my 
> original posts.
>
> Here it is:
>
> All of my nodes are designed for reuse. I use GUIDs as identifiers. See 
> the Declarative diagram, below.
>
>
> 
>
>
>
>
> When I create a statement (graph) I associate three nodes to create a 
> relationship.  The reason I use nodes to establish the nature of the 
> relationship is to avoid semantically sloppy edges. For example, I could 
> use "Lives_In" or "Resides_In" or "Has_Home_In" to connect 'Fred 
> Flintstone' and 'Bedrock' but I chose to model it this way:
>
>
> 
>
>
> The statement: "Fred Flintstone Is A Resident of Bedrock" is true and 
> navigable. I have assigned it a GUID to help describe what I want to do 
> after I load more relationships. But  here is where I get into some 
> trouble. When I make a statement about Fred's friend Gill I want to reuse 
> the "Resident" node:
>
>
> 
>
> Again, I assigned a GUID for the statement as a place-holder.  When I load 
> all this into Neo4J (not including the statement GUIDs) I get this:
>
>
>
> 
>
>
> Without the statement GUIDs in there somewhere, the residency of both Fred 
> and Gill is in doubt, yes?
>
> I will read the material you sent (many, many thanks) and see if what you 
> are proposing solves this dilemma for me. 
>
> Best regards.
>
> John O'
>
> On Sunday, March 13, 2016 at 7:57:04 AM UTC-6, Bo Ferri wrote:
>>
>> Hi John,
>>
>> I'm not really sure what you are looking for. Are you looking for
>>
>> 1. identifiers for single statements a.k.a. triples, i.e., node-edge-node 
>> parts
>>
>> or
>>
>> 2. identifiers for (sub) graphs,i.e., multiple statements 
>> (node-edge-node) that belong together; this can be for example Concise 
>> Bounded Descriptions (CBD, [1]), i.e., flat or hierarchical records, or 
>> Named Graphs [2]
>>
>> For our datamanagement platform d:swarm [3] we dealt with both issues, 
>> i.e., we assign statement identifiers to every (content) relationship 
>> (/statement) in our graph in form of a hash and furthermore we are able to 
>> divide the graph into multiple named graphs (which are named 'data model' 
>> in our domain model). See [4] for an example of how this can be look like. 
>> There you can see a single record with a hierarchical structure. In [5] you 
>> can see a flat record, whereby a relationship is selected. There you can 
>> see the data model identifier (a prefixed URI), a resource identifier (a 
>> hash; which is especially important for hierarchical records) and a 
>> statement identifier (a hashed UUID). Furthermore, properties at 
>> relationships enable us to add further qualified statements, e.g., order or 
>> version range.
>> All this is baked into a (experimental) Neo4j Unmanaged Extension [6,7].
>>
>> Maybe this is something you are looking for, or maybe it helps you to 
>> express what you are looking for (at least ;) ).
>>
>> Cheers,
>>
>>
>> Bo
>>
>>
>> [1] https://www.w3.org/Submission/CBD/
>> [2] https://en.wikipedia.org/wiki/Named_graph
>> [3] https://github.com/dswarm/dswarm-documentation/wiki
>> [4] 
>> 

[Neo4j] Re: Triple-Like 'facts' instead of Hyper-edges ?

2016-03-14 Thread John O'Gorman
Wow - Bo - you just made my day!  This is an amazing amount of quality work 
here. 

When I've read through the documentation and the presentations in more 
detail, I'll post again but I am enormously impressed.

Thanks again!

John O'

On Sunday, March 13, 2016 at 7:57:04 AM UTC-6, Bo Ferri wrote:
>
> Hi John,
>
> I'm not really sure what you are looking for. Are you looking for
>
> 1. identifiers for single statements a.k.a. triples, i.e., node-edge-node 
> parts
>
> or
>
> 2. identifiers for (sub) graphs,i.e., multiple statements (node-edge-node) 
> that belong together; this can be for example Concise Bounded Descriptions 
> (CBD, [1]), i.e., flat or hierarchical records, or Named Graphs [2]
>
> For our datamanagement platform d:swarm [3] we dealt with both issues, 
> i.e., we assign statement identifiers to every (content) relationship 
> (/statement) in our graph in form of a hash and furthermore we are able to 
> divide the graph into multiple named graphs (which are named 'data model' 
> in our domain model). See [4] for an example of how this can be look like. 
> There you can see a single record with a hierarchical structure. In [5] you 
> can see a flat record, whereby a relationship is selected. There you can 
> see the data model identifier (a prefixed URI), a resource identifier (a 
> hash; which is especially important for hierarchical records) and a 
> statement identifier (a hashed UUID). Furthermore, properties at 
> relationships enable us to add further qualified statements, e.g., order or 
> version range.
> All this is baked into a (experimental) Neo4j Unmanaged Extension [6,7].
>
> Maybe this is something you are looking for, or maybe it helps you to 
> express what you are looking for (at least ;) ).
>
> Cheers,
>
>
> Bo
>
>
> [1] https://www.w3.org/Submission/CBD/
> [2] https://en.wikipedia.org/wiki/Named_graph
> [3] https://github.com/dswarm/dswarm-documentation/wiki
> [4] 
> https://docs.google.com/presentation/d/1Aa_JM8YjSOF3A4LPm0ZuoFWzu5h-NN7VtygAE0WG97Q/pub?start=false=false=6#slide=id.g58f97b25d_0_280
> [5] 
> https://docs.google.com/presentation/d/1Aa_JM8YjSOF3A4LPm0ZuoFWzu5h-NN7VtygAE0WG97Q/pub?start=false=false=6#slide=id.g58f97b25d_0_292
> [6] https://github.com/dswarm/dswarm-graph-neo4j
> [7] https://github.com/dswarm/dswarm-documentation/wiki/Graph-Data-Model
>
>
> On Saturday, March 12, 2016 at 4:39:45 PM UTC+1, John O'Gorman wrote:
>>
>> Maybe I can try to clarify my ideas a bit.
>>
>> When a cluster of nodes is persistent (the same nodes relate to each 
>> other to, say, uniquely identify an individual person) I would like to be 
>> able to link the cluster without losing the identity of the component 
>> nodes.  Since all my individual nodes are potentially reusable I can still 
>> connect to them if a design requires it, but creating a relationship to a 
>> cluster should be similar to doing a join without knowing what other 
>> information is attached.
>>
>> Clear as mud?
>>
>>
>>
>> On Thursday, March 10, 2016 at 12:31:49 PM UTC-7, John O'Gorman wrote:
>>>
>>> I am working with a Neo4J model that uses a finite set of Labels based 
>>> on the six interrogatives (Who, What, When, Where, Why and How) and on a 
>>> similarly constrained set of relationships: Is_A, Is_Has, Is_Part_Has, 
>>> Is_Precedent_Has, Is_Equivalent_Has and Is_Property_Has.   Since the nature 
>>> of a Relationship in this model uses nodes instead of arbitrary edges (i.e. 
>>> "Lives_In" for  the example below, I end up with statements (in pseudo 
>>> Cypher) like the following:
>>>
>>> :Person {'Fred Flinstone'}  - [:Is_Has] -> :Status {'Resident'} <- 
>>> [:Is_Has} - :Place {'Bedrock'} 
>>>
>>> My question is:  I was wondering if I can assign a unique identifier (or 
>>> a URI) to the statement above in order to reference it (establish a new 
>>> relationship to it) later. 
>>>
>>> I am thinking it would be a better alternative than hyper-edges.
>>>
>>> Thoughts? Other than (WTH is he thinking?) :D
>>>
>>> Thanks.
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to neo4j+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


[Neo4j] Re: Triple-Like 'facts' instead of Hyper-edges ?

2016-03-14 Thread John O'Gorman
Hi Bo - I think you may have put me back on track.

The answer to you question is both: I drew up a summary of the problem 
(that I should have posted first) so apologies for the fogginess of my 
original posts.

Here it is:

All of my nodes are designed for reuse. I use GUIDs as identifiers. See the 
Declarative diagram, below.






When I create a statement (graph) I associate three nodes to create a 
relationship.  The reason I use nodes to establish the nature of the 
relationship is to avoid semantically sloppy edges. For example, I could 
use "Lives_In" or "Resides_In" or "Has_Home_In" to connect 'Fred 
Flintstone' and 'Bedrock' but I chose to model it this way:




The statement: "Fred Flintstone Is A Resident of Bedrock" is true and 
navigable. I have assigned it a GUID to help describe what I want to do 
after I load more relationships. But  here is where I get into some 
trouble. When I make a statement about Fred's friend Gill I want to reuse 
the "Resident" node:



Again, I assigned a GUID for the statement as a place-holder.  When I load 
all this into Neo4J (not including the statement GUIDs) I get this:





Without the statement GUIDs in there somewhere, the residency of both Fred 
and Gill is in doubt, yes?

I will read the material you sent (many, many thanks) and see if what you 
are proposing solves this dilemma for me. 

Best regards.

John O'

On Sunday, March 13, 2016 at 7:57:04 AM UTC-6, Bo Ferri wrote:
>
> Hi John,
>
> I'm not really sure what you are looking for. Are you looking for
>
> 1. identifiers for single statements a.k.a. triples, i.e., node-edge-node 
> parts
>
> or
>
> 2. identifiers for (sub) graphs,i.e., multiple statements (node-edge-node) 
> that belong together; this can be for example Concise Bounded Descriptions 
> (CBD, [1]), i.e., flat or hierarchical records, or Named Graphs [2]
>
> For our datamanagement platform d:swarm [3] we dealt with both issues, 
> i.e., we assign statement identifiers to every (content) relationship 
> (/statement) in our graph in form of a hash and furthermore we are able to 
> divide the graph into multiple named graphs (which are named 'data model' 
> in our domain model). See [4] for an example of how this can be look like. 
> There you can see a single record with a hierarchical structure. In [5] you 
> can see a flat record, whereby a relationship is selected. There you can 
> see the data model identifier (a prefixed URI), a resource identifier (a 
> hash; which is especially important for hierarchical records) and a 
> statement identifier (a hashed UUID). Furthermore, properties at 
> relationships enable us to add further qualified statements, e.g., order or 
> version range.
> All this is baked into a (experimental) Neo4j Unmanaged Extension [6,7].
>
> Maybe this is something you are looking for, or maybe it helps you to 
> express what you are looking for (at least ;) ).
>
> Cheers,
>
>
> Bo
>
>
> [1] https://www.w3.org/Submission/CBD/
> [2] https://en.wikipedia.org/wiki/Named_graph
> [3] https://github.com/dswarm/dswarm-documentation/wiki
> [4] 
> https://docs.google.com/presentation/d/1Aa_JM8YjSOF3A4LPm0ZuoFWzu5h-NN7VtygAE0WG97Q/pub?start=false=false=6#slide=id.g58f97b25d_0_280
> [5] 
> https://docs.google.com/presentation/d/1Aa_JM8YjSOF3A4LPm0ZuoFWzu5h-NN7VtygAE0WG97Q/pub?start=false=false=6#slide=id.g58f97b25d_0_292
> [6] https://github.com/dswarm/dswarm-graph-neo4j
> [7] https://github.com/dswarm/dswarm-documentation/wiki/Graph-Data-Model
>
>
> On Saturday, March 12, 2016 at 4:39:45 PM UTC+1, John O'Gorman wrote:
>>
>> Maybe I can try to clarify my ideas a bit.
>>
>> When a cluster of nodes is persistent (the same nodes relate to each 
>> other to, say, uniquely identify an individual person) I would like to be 
>> able to link the cluster without losing the identity of the component 
>> nodes.  Since all my individual nodes are potentially reusable I can still 
>> connect to them if a design requires it, but creating a relationship to a 
>> cluster should be similar to doing a join without knowing what other 
>> information is attached.
>>
>> Clear as mud?
>>
>>
>>
>> On Thursday, March 10, 2016 at 12:31:49 PM UTC-7, John O'Gorman wrote:
>>>
>>> I am working with a Neo4J model that uses a finite set of Labels based 
>>> on the six interrogatives (Who, What, When, Where, Why and How) and on a 
>>> similarly constrained set of relationships: Is_A, Is_Has, Is_Part_Has, 

[Neo4j] Re: Triple-Like 'facts' instead of Hyper-edges ?

2016-03-13 Thread 'Bo Ferri' via Neo4j
Hi John,

I'm not really sure what you are looking for. Are you looking for

1. identifiers for single statements a.k.a. triples, i.e., node-edge-node 
parts

or

2. identifiers for (sub) graphs,i.e., multiple statements (node-edge-node) 
that belong together; this can be for example Concise Bounded Descriptions 
(CBD, [1]), i.e., flat or hierarchical records, or Named Graphs [2]

For our datamanagement platform d:swarm [3] we dealt with both issues, 
i.e., we assign statement identifiers to every (content) relationship 
(/statement) in our graph in form of a hash and furthermore we are able to 
divide the graph into multiple named graphs (which are named 'data model' 
in our domain model). See [4] for an example of how this can be look like. 
There you can see a single record with a hierarchical structure. In [5] you 
can see a flat record, whereby a relationship is selected. There you can 
see the data model identifier (a prefixed URI), a resource identifier (a 
hash; which is especially important for hierarchical records) and a 
statement identifier (a hashed UUID). Furthermore, properties at 
relationships enable us to add further qualified statements, e.g., order or 
version range.
All this is baked into a (experimental) Neo4j Unmanaged Extension [6,7].

Maybe this is something you are looking for, or maybe it helps you to 
express what you are looking for (at least ;) ).

Cheers,


Bo


[1] https://www.w3.org/Submission/CBD/
[2] https://en.wikipedia.org/wiki/Named_graph
[3] https://github.com/dswarm/dswarm-documentation/wiki
[4] 
https://docs.google.com/presentation/d/1Aa_JM8YjSOF3A4LPm0ZuoFWzu5h-NN7VtygAE0WG97Q/pub?start=false=false=6#slide=id.g58f97b25d_0_280
[5] 
https://docs.google.com/presentation/d/1Aa_JM8YjSOF3A4LPm0ZuoFWzu5h-NN7VtygAE0WG97Q/pub?start=false=false=6#slide=id.g58f97b25d_0_292
[6] https://github.com/dswarm/dswarm-graph-neo4j
[7] https://github.com/dswarm/dswarm-documentation/wiki/Graph-Data-Model


On Saturday, March 12, 2016 at 4:39:45 PM UTC+1, John O'Gorman wrote:
>
> Maybe I can try to clarify my ideas a bit.
>
> When a cluster of nodes is persistent (the same nodes relate to each other 
> to, say, uniquely identify an individual person) I would like to be able to 
> link the cluster without losing the identity of the component nodes.  Since 
> all my individual nodes are potentially reusable I can still connect to 
> them if a design requires it, but creating a relationship to a cluster 
> should be similar to doing a join without knowing what other information is 
> attached.
>
> Clear as mud?
>
>
>
> On Thursday, March 10, 2016 at 12:31:49 PM UTC-7, John O'Gorman wrote:
>>
>> I am working with a Neo4J model that uses a finite set of Labels based on 
>> the six interrogatives (Who, What, When, Where, Why and How) and on a 
>> similarly constrained set of relationships: Is_A, Is_Has, Is_Part_Has, 
>> Is_Precedent_Has, Is_Equivalent_Has and Is_Property_Has.   Since the nature 
>> of a Relationship in this model uses nodes instead of arbitrary edges (i.e. 
>> "Lives_In" for  the example below, I end up with statements (in pseudo 
>> Cypher) like the following:
>>
>> :Person {'Fred Flinstone'}  - [:Is_Has] -> :Status {'Resident'} <- 
>> [:Is_Has} - :Place {'Bedrock'} 
>>
>> My question is:  I was wondering if I can assign a unique identifier (or 
>> a URI) to the statement above in order to reference it (establish a new 
>> relationship to it) later. 
>>
>> I am thinking it would be a better alternative than hyper-edges.
>>
>> Thoughts? Other than (WTH is he thinking?) :D
>>
>> Thanks.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to neo4j+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


[Neo4j] Re: Triple-Like 'facts' instead of Hyper-edges ?

2016-03-12 Thread John O'Gorman
Maybe I can try to clarify my ideas a bit.

When a cluster of nodes is persistent (the same nodes relate to each other 
to, say, uniquely identify an individual person) I would like to be able to 
link the cluster without losing the identity of the component nodes.  Since 
all my individual nodes are potentially reusable I can still connect to 
them if a design requires it, but creating a relationship to a cluster 
should be similar to doing a join without knowing what other information is 
attached.

Clear as mud?



On Thursday, March 10, 2016 at 12:31:49 PM UTC-7, John O'Gorman wrote:
>
> I am working with a Neo4J model that uses a finite set of Labels based on 
> the six interrogatives (Who, What, When, Where, Why and How) and on a 
> similarly constrained set of relationships: Is_A, Is_Has, Is_Part_Has, 
> Is_Precedent_Has, Is_Equivalent_Has and Is_Property_Has.   Since the nature 
> of a Relationship in this model uses nodes instead of arbitrary edges (i.e. 
> "Lives_In" for  the example below, I end up with statements (in pseudo 
> Cypher) like the following:
>
> :Person {'Fred Flinstone'}  - [:Is_Has] -> :Status {'Resident'} <- 
> [:Is_Has} - :Place {'Bedrock'} 
>
> My question is:  I was wondering if I can assign a unique identifier (or a 
> URI) to the statement above in order to reference it (establish a new 
> relationship to it) later. 
>
> I am thinking it would be a better alternative than hyper-edges.
>
> Thoughts? Other than (WTH is he thinking?) :D
>
> Thanks.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to neo4j+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.